1. 程式人生 > >如何保證MQ消息必達

如何保證MQ消息必達

冪等性 需要 組成 source 流程 問題 存儲 art 主動

此文章屬於筆記,原屬58沈劍

一、MQ消息必達,架構上的兩個核心設計點:

  1. 消息落地
  2. 消息超時、重傳、確認
  3. 四大部件:發送端 接收端 服務端 固化存儲組成

二、上半場消息必達以及消息重復問題

  1. 上半場的流程
    1. 發送端MQ-client 將消息發送給服務端MQ-server
    2. 服務端MQ-server將消息落地
    3. 服務端MQ-server 回ACK(表示確認) 2.如果3丟失 發送端在超時後,又會發送一遍,此時重發是MQ-client發起的,消息處理的是MQ-server 為了避免2 重復落地,對每條MQ消息系統內部需要生成一個inner-msg-id,作為去重和冪等的依據,這個內部消息ID 的特點是
    4. 全局唯一
    5. MQ生成,具備業務無關性,對消息發送方和消息接收

三、下半場的消息必達以及消息重復問題

  1. 下半場的流程
    1. 服務端將消息發給MQ-client
    2. MQ-client將消息消費 並通知MQ-server
    3. MQ-server 落地消息刪除
  2. 需要強調的是,接收端MQ-client回ACK消息是MQ-client主動發起的,因為MQ-server不知道接收端何時消費完。 3.如果5丟失,那麽在超時後MQ-server會重新發送消息,此時可能導致MQ-client收到重復消息,為了保證業務的冪等性,業務消息中,必須有一個biz-id,作為去重的依據,這個業務ID的特性是
    1. 對於同一個業務場景,全局唯一
    2. 由業務消息發送方生成,業務相關
    3. 由業務消費方消費判斷重復問題,以保證冪等

四、總結

MQ為了保證消息必達,消息上下半場均可能發送重復消息,如何保證消息的冪等性呢

  1. 上半場,MQ-server生成inner-msg-id,保證上半場冪等 此ID全局唯一,業務無關,由MQ保證,對上下MQ-client屏蔽
  2. 下半場,由發送方帶入biz-id 業務方接受並判斷重復問題,保證冪等,這個ID對單業務唯一,業務相關,對MQ透明 結論 冪等性,不僅對MQ有要求,對業務上下遊也有要求

如何保證MQ消息必達