MQ之如何做到消息必達

一、架構方向

MQ要想盡量消息必達,架構上有兩個核心設計點:

(1)消息落地

(2)消息超時、重傳、確認

二、MQ核心架構


上圖是一個MQ的核心架構圖,基本可以分為三大塊:

(1)發送方->左側粉色部分

(2)MQ核心集群->中間藍色部分

(3)接收方->右側黃色部分

粉色發送方又由兩部分構成:業務調用方MQ-client-sender

其中后者向前者提供了兩個核心API:

SendMsg(bytes[] msg)

SendCallback()

藍色MQ核心集群又分為四個部分:MQ-server,zk,db,管理后臺web

黃色接收方也由兩部分構成:業務接收方MQ-client-receiver

其中后者向前者提供了兩個核心API:

RecvCallback(bytes[] msg)

SendAck()

MQ是一個系統間解耦的利器,它能夠很好的解除發布訂閱者之間的耦合,它將上下游的消息投遞解耦成兩個部分,如上述架構圖中的1箭頭和2箭頭:

(1)發送方將消息投遞給MQ,上半場

(2)MQ將消息投遞給接收方,下半場

三、MQ消息可靠投遞核心流程

MQ既然將消息投遞拆成了上下半場,為了保證消息的可靠投遞,上下半場都必須盡量保證消息必達。


MQ消息投遞

上半場

,MQ-client-sender到MQ-server流程見上圖1-3:

(1)MQ-client將消息發送給MQ-server(此時業務方調用的是API:SendMsg)

(2)MQ-server將消息落地,落地后即為發送成功

(3)MQ-server將應答發送給MQ-client(此時回調業務方是API:SendCallback)

MQ消息投遞下半場,MQ-server到MQ-client-receiver流程見上圖4-6:

(1)MQ-server將消息發送給MQ-client(此時回調業務方是API:RecvCallback)

(2)MQ-client回復應答給MQ-server(此時業務方主動調用API:SendAck)

(3)MQ-server收到ack,將之前已經落地的消息刪除,完成消息的可靠投遞

如果消息丟了怎么辦?

MQ消息投遞的上下半場,都可以出現消息丟失,為了降低消息丟失的概率,MQ需要進行超時和重傳。

上半場的超時與重傳

MQ上半場的1或者2或者3如果丟失或者超時,MQ-client-sender內的timer會重發消息,直到期望收到3,如果重傳N次后還未收到,則SendCallback回調發送失敗,需要注意的是,這個過程中MQ-server可能會收到同一條消息的多次重發。

下半場的超時與重傳

MQ下半場的4或者5或者6如果丟失或者超時,MQ-server內的timer會重發消息,直到收到5并且成功執行6,這個過程可能會重發很多次消息,一般采用指數退避的策略,先隔x秒重發,2x秒重發,4x秒重發,以此類推,需要注意的是,這個過程中MQ-client-receiver也可能會收到同一條消息的多次重發。

MQ-client與MQ-server如何進行消息去重,如何進行架構冪等性設計,下一次撰文另述,此處暫且認為為了保證消息必達,可能收到重復的消息。

四、總結

消息總線是系統之間的解耦利器,但切勿濫用,未來也會撰文細究MQ的使用場景,消息總線為了盡量保證消息必達,架構設計方向為:

(1)消息收到先落地

(2)消息超時、重傳、確認保證消息必達

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容