消息的同步發送,異步發送以及消息發送的可靠性

最近寫的一個通信框架中有兩種最基本的消息發送方式:同步發送和異步發送。

同步方式:
消息的發送方發A送一條消息到接收端B,B收到消息之後需要對消息進行處理,然後發送ACK確認消息回A,A收到B的ACK之後就可以認爲這條消息發送成功,並且保證B順利收到並處理,在A收到ACK之前A將一直處於阻塞等待狀態。

異步方式:
可細分成發送線程和接受線程異步,發送端進程和接收端進程異步;

發送線程和接收線程的異步指消息發送線程A發消息到B,A和B都有消息的接收和發送緩存,A將消息送入發緩存之後立即返回接着發下一條消息,緩存中的消息將被逐條寫入TCP,B端從TCP拿到消息先入收緩存,B從收緩存中逐條取出處理,這裏的收發兩個線程處於不同的進程中,且同一時間可能同時處理不同的消息。

發送端進程和接收端端進程異步指的是,發送方和接收方不必同時在線,A將消息發送到消息隊列,B上線之後從消息隊列中獲取A發送過來的消息。

同步和異步發送消息對於消息發送可靠性的保障上有區別。這裏的消息發送可靠性指消息在網絡連接異常斷開,進程異常重啓之後所有的消息都不丟失。


同步發送保證了每條消息都被順利收到並得到處理,若發送消息之後等待ACK超時表示對方可能未妥善收到並處理消息,發送方可以對消息進行重發等操作。因此同步發送的方式一定程度上保證了消息的可靠性。

異步方式由於中間存在收發緩存,當接收端進程異常重啓,緩存內消息可能丟失,因此發送方發出去的消息並不能保證被接收並得到處理。像線程級的異步來說,必須在收發雙方的消息中增加消息序列號,並對發送的每條消息,消息發送的序列號,消息接收的序列號進行持久化,這樣進程重啓之後可以對雙方的序列號進行同步,從持久化模塊中取出丟失的部分消息。以這樣的方式才能保證消息發送的可靠性。

進程級的異步收發兩端消息均通過中間的消息隊列進行,消息隊列最常見的就是消息中間件,JMS,MQ等等,發送端通過同步方式將消息發往消息隊列,消息隊列必須對消息進行持久化,然後以異步或同步方式發往消息接收方,這裏的關鍵就是發送方和MQ之間通過同步方式和MQ上的消息持久化來保A,B兩端的消息發送可靠性。

在保證消息發送可靠性的前提下同步方式發送消息的處理性能可能反而超越異步方式的發送,原因是異步發送每條消息需要進行多次地持久化數據。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章