此文章屬於筆記,原屬58沈劍
1、MQ消息必達,架構上的兩個核心設計點:
- 消息落地
- 消息超時、重傳、確認
- 四大部件:發送端 接收端 服務端 固化存儲組成
2、上半場消息必達以及消息重複問題
- 上半場的流程
- 發送端MQ-client 將消息發送給服務端MQ-server
- 服務端MQ-server將消息落地
- 服務端MQ-server 回ACK(表示確認) 2.若是3丟失 發送端在超時後,又會發送一遍,此時重發是MQ-client發起的,消息處理的是MQ-server 爲了不2 重複落地,對每條MQ消息系統內部須要生成一個inner-msg-id,做爲去重和冪等的依據,這個內部消息ID 的特色是
- 全局惟一
- MQ生成,具有業務無關性,對消息發送方和消息接收
3、下半場的消息必達以及消息重複問題
- 下半場的流程
- 服務端將消息發給MQ-client
- MQ-client將消息消費 並通知MQ-server
- MQ-server 落地消息刪除
- 須要強調的是,接收端MQ-client回ACK消息是MQ-client主動發起的,由於MQ-server不知道接收端什麼時候消費完。 3.若是5丟失,那麼在超時後MQ-server會從新發送消息,此時可能致使MQ-client收到重複消息,爲了保證業務的冪等性,業務消息中,必須有一個biz-id,做爲去重的依據,這個業務ID的特性是
- 對於同一個業務場景,全局惟一
- 由業務消息發送方生成,業務相關
- 由業務消費方消費判斷重複問題,以保證冪等
4、總結
MQ爲了保證消息必達,消息上下半場都可能發送重複消息,如何保證消息的冪等性呢架構
- 上半場,MQ-server生成inner-msg-id,保證上半場冪等 此ID全局惟一,業務無關,由MQ保證,對上下MQ-client屏蔽
- 下半場,由發送方帶入biz-id 業務方接受並判斷重複問題,保證冪等,這個ID對單業務惟一,業務相關,對MQ透明 結論 冪等性,不只對MQ有要求,對業務上下游也有要求