<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          MQ,究竟如何保證消息冪等?

          共 1640字,需瀏覽 4分鐘

           ·

          2020-10-19 00:46

          MQ的核心架構(gòu)如何?
          MQ核心架構(gòu),它由發(fā)送端、服務端、固化存儲、接收端四大部分組成。

          MQ如何保證消息必達?
          MQ消息必達,架構(gòu)上有兩個核心設計點:
          (1)消息落地;
          (2)消息超時、重傳、確認;
          畫外音:詳見核心架構(gòu)中的步驟1-6。

          MQ消息重傳,是否可能導致重復的消息?
          有可能。

          為保證消息的可達性,超時、重傳、確認機制可能導致MQ、或者業(yè)務方收到重復的消息,從而對業(yè)務產(chǎn)生影響。

          舉個栗子:
          購買會員卡,上游支付系統(tǒng)負責給用戶扣款,下游系統(tǒng)負責給用戶發(fā)卡,通過MQ異步通知。不管是上半場的ACK丟失,導致MQ收到重復的消息,還是下半場ACK丟失,導致購卡系統(tǒng)收到重復的購卡通知,都可能出現(xiàn),上游扣了一次錢,下游發(fā)了多張卡

          為了避免對業(yè)務的影響,MQ如何保證冪等性?
          MQ的冪等性,由兩部分構(gòu)成:
          (1)MQ發(fā)送端,到MQ-server的冪等性(上半場);
          (2)MQ-server,到MQ接收端的冪等性(下半場);
          ?
          上半場消息發(fā)送,如何保證冪等性?
          MQ消息發(fā)送上半場,即上圖中的1-3:
          (1)發(fā)送端MQ-client將消息發(fā)給服務端MQ-server;
          (2)服務端MQ-server將消息落地;
          (3)服務端MQ-server回ACK給發(fā)送端MQ-client;
          如果3丟失,發(fā)送端MQ-client超時后會重發(fā)消息,可能導致服務端MQ-server收到重復消息。
          ?
          此時重發(fā)是MQ-client發(fā)起的,消息的處理是MQ-server,為了避免步驟2落地重復的消息,對每條消息,MQ系統(tǒng)內(nèi)部必須生成一個inner-msg-id,作為去重和冪等的依據(jù),這個內(nèi)部消息ID的特性是:
          (1)全局唯一;
          (2)MQ生成,具備業(yè)務無關(guān)性,對消息發(fā)送方和消息接收方屏蔽;
          ?
          有了這個inner-msg-id,就能保證上半場重發(fā),也只有1條消息落到MQ-server的DB中,實現(xiàn)上半場冪等。
          ?
          下半場消息發(fā)送,如何保證冪等性?
          MQ消息發(fā)送下半場,即上圖中的4-6:
          (1)服務端MQ-server將消息發(fā)給接收端MQ-client;
          (2)接收端MQ-client回ACK給服務端;
          (3)服務端MQ-server將落地消息刪除;
          需要強調(diào)的是,接收端MQ-client回ACK給服務端MQ-server,是消息消費業(yè)務方的主動調(diào)用行為,不能由MQ-client自動發(fā)起,因為MQ系統(tǒng)不知道消費方什么時候真正消費成功。
          如果5丟失,服務端MQ-server超時后會重發(fā)消息,可能導致MQ-client收到重復的消息
          ?
          此時重發(fā)是MQ-server發(fā)起的,消息的處理是消息消費業(yè)務方,消息重發(fā)勢必導致業(yè)務方重復消費(上例中的一次付款,重復發(fā)卡),為了保證業(yè)務冪等性,業(yè)務消息體中,必須有一個biz-id,作為去重和冪等的依據(jù),這個業(yè)務ID的特性是:
          (1)對于同一個業(yè)務場景,全局唯一;
          (2)由業(yè)務消息發(fā)送方生成,業(yè)務相關(guān),對MQ透明;
          (3)由業(yè)務消息消費方負責判重,以保證冪等;
          ?
          最常見的業(yè)務ID有:支付ID,訂單ID,帖子ID等。
          ?
          具體到支付購卡場景,發(fā)送方必須將支付ID放到消息體中,消費方必須對同一個支付ID進行判重,保證購卡的冪等。
          ?
          有了這個業(yè)務ID,才能夠保證下半場消息消費業(yè)務方即使收到重復消息,也只有1條消息被消費,保證了冪等。
          ?
          總結(jié),MQ如何保證消息冪等?

          首先,上半場冪等。
          MQ-client生成inner-msg-id,保證上半場冪等。
          這個ID全局唯一,業(yè)務無關(guān),由MQ保證。
          ?
          然后,下半場冪等。
          業(yè)務發(fā)送方帶入biz-id,業(yè)務接收方去重保證冪等。
          這個ID對單業(yè)務唯一,業(yè)務相關(guān),對MQ透明。

          因此,冪等性,不僅對MQ有要求,對業(yè)務上下游也有要求。
          真人出鏡,歡迎關(guān)注+點贊
          瀏覽 32
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  美女被操的网站 | 91土豪约大长腿美女嫩模 | 做爱视频网 | 黄色网址中文字幕不卡 | 人人撸夜夜撸 |