<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>

          3分鐘白話RocketMQ系列—— 如何保證消息順序性

          共 2772字,需瀏覽 6分鐘

           ·

          2023-09-21 18:34



          實(shí)現(xiàn)的消息的順序性主要有兩個(gè)維度,分別是「全局有序」和「局部有序」。

          我們圍繞這兩個(gè)方面來白話下消息順序性問題。

          關(guān)鍵字摘要

          • 全局有序

          • 局部有序

          • 局部有序能一直有序嗎

          • 順序消息的限制

          Q1:什么是全局有序?如何實(shí)現(xiàn)全局有序?

          適用于性能要求不高,所有的消息嚴(yán)格按照先進(jìn)先出(FIFO)的原則來發(fā)布和消費(fèi)的場(chǎng)景。

          例如,在證券處理中,以人民幣兌換美元為Topic,在價(jià)格相同的情況下,先出價(jià)者優(yōu)先處理,則可以按照FIFO的方式發(fā)布和消費(fèi)全局順序消息。

          要實(shí)現(xiàn)全局有序,必須控制Topic只有一個(gè)隊(duì)列queue,才能實(shí)現(xiàn)全局有序。

          由于只有一個(gè)隊(duì)列存在,這種方式雖然保證了全局有序,但是性能不高,無法擴(kuò)展。

          Q2:什么是局部有序?如何實(shí)現(xiàn)局部有序?

          適用于性能要求高,以Sharding Key作為分區(qū)字段,在同一個(gè)隊(duì)列queue中嚴(yán)格地按照FIFO原則進(jìn)行消息發(fā)布和消費(fèi)的場(chǎng)景。

          例如,用戶注冊(cè)需要發(fā)送發(fā)驗(yàn)證碼,以用戶ID作為Sharding Key,那么同一個(gè)用戶發(fā)送的消息都會(huì)按照發(fā)布的先后順序來消費(fèi)。

          保證「消息生產(chǎn)」的順序性,則必須滿足以下條件:

          • 單一生產(chǎn)者:消息生產(chǎn)的順序性僅支持單一生產(chǎn)者,不同生產(chǎn)者分布在不同的系統(tǒng),即使設(shè)置相同的分區(qū)鍵,不同生產(chǎn)者之間產(chǎn)生的消息也無法判定其先后順序。

          • 串行發(fā)送:生產(chǎn)者客戶端支持多線程安全訪問,但如果生產(chǎn)者使用多線程并行發(fā)送,則不同線程間產(chǎn)生的消息將無法判定其先后順序。

          滿足以上條件的生產(chǎn)者,將 「順序消息」 發(fā)送至服務(wù)端后,會(huì)保證設(shè)置了同一分區(qū)鍵的消息,按照發(fā)送順序存儲(chǔ)在同一隊(duì)列中。

          局部有序(分區(qū)有序)

          注意,在RocketMQ 5.x版本中,新增了「消息組」概念,順序消息發(fā)送必須要設(shè)置消息組。

          保證「消息消費(fèi)」的順序性,則必須滿足以下條件:

          • 語義正確。業(yè)務(wù)方消費(fèi)消息時(shí)需要嚴(yán)格按照 接收---處理---應(yīng)答 的語義處理消息,避免因異步處理導(dǎo)致消息亂序。

          • 有限重試。順序消息消費(fèi)投遞次數(shù)限定有限范圍內(nèi),即一條消息如果超過最大重試次數(shù)后,將跳過這條消息消費(fèi),不會(huì)一直阻塞后續(xù)消息處理。

          對(duì)于需要嚴(yán)格保證消費(fèi)順序的場(chǎng)景,請(qǐng)務(wù)必設(shè)置合理的重試次數(shù),避免參數(shù)不合理導(dǎo)致消息亂序。

          Q3:如果Broker掉線,局部有序還能保持有序嗎?

          如果一個(gè)Broker掉線,那么此時(shí)隊(duì)列總數(shù)是否會(huì)發(fā)化?

          如果發(fā)生變化,那么同一個(gè) ShardingKey 的消息就會(huì)發(fā)送到不同的隊(duì)列上,造成亂序。

          如果不發(fā)生變化,那消息將會(huì)發(fā)送到掉線Broker的隊(duì)列上,必然是失敗的。

          因此 Apache RocketMQ 提供了兩種模式,如果要保證嚴(yán)格順序而不是可用性,創(chuàng)建 Topic 是要指定 -o 參數(shù)(--order)為true,表示順序消息:

          $ sh bin/mqadmin updateTopic -c DefaultCluster -t TopicTest -o true -n 127.0.0.1:9876
          create topic to 127.0.0.1:10911 success.
          TopicConfig [topicName=TopicTest, readQueueNums=8, writeQueueNums=8, perm=RW-, topicFilterType=SINGLE_TAG, topicSysFlag=0, order=true, attributes=null]

          其次,要保證NameServer中的配置 orderMessageEnable 和 returnOrderTopicConfigToBroker 必須是 true。

          如果上述任意一個(gè)條件不滿足,則是保證可用性而不是嚴(yán)格順序。

          Q4: 順序消息有哪些限制?

          1)同一條消息是否可以既是順序消息,又是定時(shí)消息和事務(wù)消息?

          不可以。順序消息、定時(shí)消息、事務(wù)消息是不同的消息類型,三者是互斥關(guān)系,不能疊加在一起使用。

          2)為什么全局順序消息性能一般?

          全局順序消息是嚴(yán)格按照FIFO的消息阻塞原則,即上一條消息沒有被成功消費(fèi),那么下一條消息會(huì)一直被存儲(chǔ)到Topic隊(duì)列中。

          關(guān)鍵字總結(jié)

          • 全局有序:必須控制Topic只有一個(gè)隊(duì)列queue,才能實(shí)現(xiàn)全局有序,性能一般。

          • 局部有序:性能較好,需要確保「生產(chǎn)有序」和「消費(fèi)有序」,同時(shí)注意Broker掉線時(shí)的 可用性 與 有序性 權(quán)衡。

          3分鐘到了嗎?應(yīng)該對(duì)RocketMQ如何生產(chǎn)消息有全面了解了吧。
          如果還想了解更多,歡迎關(guān)注下一期內(nèi)容。


          往期熱門筆記合集推薦:


          原創(chuàng):阿丸筆記(微信公眾號(hào):aone_note),歡迎 分享,轉(zhuǎn)載請(qǐng)保留出處。

          沒有留言功能的悲傷,掃描下方二維碼「加我」聊些有的沒的吧~

                                                                                        覺得不錯(cuò),就點(diǎn)個(gè) 再看 吧??



          瀏覽 126
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <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>
                  我要操在线视频 | 爱情岛亚洲品质自拍视频 | 天天干天天色天天曹 | 国产不卡免费视频 | 亚洲精品久久久久久久蜜桃 |