国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

如何解決回到MQ的消息順序問題

數據分析與開發 ? 來源:微觀技術 ? 作者:微觀技術 ? 2021-11-18 16:07 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

為了系統間解耦,我們通常會引入MQ框架,大家各司其職共同完成上下游的業務流程。

大致過程:

生產端,創建一條消息,通過網絡發送到MQ Server

MQ將 消息存儲在topic 的一個分區里

消費端,從分區中拉取消息,消費處理

但現實往往不一樣!MQ 架構設計要滿足高并發、高性能、高可用等指標

單分區,達不到我們的吞吐量要求,我們考慮采用多分區架構設計,正所謂 ”三個臭皮匠賽過一個諸葛亮“,多分區可以有效分攤全局壓力,提升整體系統性能。

兩臺 MQ機器,組成一個集群,原先一個分區存儲6條消息,現在分攤到兩個分區,每個分區各存儲3條消息,性能比上面那個提升一倍。

貌似可以滿足我們的需求,但任何事情都有兩面性!

我們看看下面業務場景:

一個用戶在電商網站上下訂單到交易完成,中間會經歷一系列動作,訂單的狀態也會隨之變化,一個訂單會產生多條MQ消息,下單、付款、發貨、買家確認收貨,消費端需要嚴格按照業務狀態機的順序處理,否則,就會出現業務問題。

我們發現,消息帶上了狀態,不再是一個個獨立的個體,有了上下文依賴關系!

對于這個問題,突然想到HTTP協議,其本身也是無狀態的,也就是說前后兩次請求沒有關聯,但有些業務功能有登錄要求,那怎么解決?

引入Cookie機制,每次請求客戶端額外傳輸一些數據,來達到上下文關聯。

回到MQ的消息順序問題,我們要如何解決?

答案:各退一步,保證局部有序。

比如上面的電商例子,只要保證一個訂單的多條狀態消息在同一個分區,便可以滿足業務需求,這個方案可以覆蓋大部分的業務場景。

這里面只需要有一個路由策略組件,由它決定消息該放到哪個分區中!

考慮到市面MQ開源框架很多,常見的如:Kafka、Pulsar、RabbitMQ、RocketMQ 等,API方法略有區別,但設計思路是相通的。

接下來,我們以 RocketMQ 為例:

生產端提供了一個接口 MessageQueueSelector

public interface MessageQueueSelector {

MessageQueue select(final List《MessageQueue》 mqs, final Message msg, final Object arg);

}

接口內定義一個select方法,具體參數含義:

mqs:該Topic下所有的隊列分片

msg:待發送的消息

arg:發送消息時傳遞的參數

關于MessageQueueSelector接口,RocketMQ 框架提供了三個默認實現類:

1、SelectMessageQueueByHash:

arg參數的hashcode的絕對值,然后對mqs.size()取余,得到目標隊列在mqs的下標

2、SelectMessageQueueByRandom:

對mqs.size()值取隨機數作為目標隊列在mqs的下標

3、SelectMessageQueueByMachineRoom

返回null

特別注意:

雖然保證了單個分片的消息有序,但每個分片的消費者只能是單線程處理,因為多線程無法控制消費順序。這個可能會損失一些性能。

這里又引出另一個問題,如何保證一個隊列只能有一個消費端呢?

1、

org.apache.rocketmq.client.impl.consumer.RebalanceImpl#updateProcessQueueTableInRebalance

0e1ca392-4837-11ec-b939-dac502259ad0.jpg

遍歷一個topic下所有的MessageQueue

isOrder && !this.lock(mq) 嘗試對它加鎖,確保一個MessageQueue只能被一個消費者處理

2、將PullRequest對象放入PullMessageService的pullRequestQueue隊列中

public void dispatchPullRequest(List《PullRequest》 pullRequestList) {

for (PullRequest pullRequest : pullRequestList) {

this.defaultMQPushConsumerImpl.executePullRequestImmediately(pullRequest);

log.info(“doRebalance, {}, add a new pull request {}”, consumerGroup, pullRequest);

}

}

3、org.apache.rocketmq.client.impl.consumer.PullMessageService#run

0e55332e-4837-11ec-b939-dac502259ad0.jpg

PullMessageService 是一個Runnable線程任務

無限循環,從隊列中拉取、處理消息

另一個問題,如何保證一個隊列,只有一個線程在處理消息呢?

1、 DefaultMQPushConsumerImpl#pullMessage

0e9b4c24-4837-11ec-b939-dac502259ad0.jpg

ConsumeMessageService 中有兩個實現類,因為我們有消費順序要求,會選擇ConsumeMessageOrderlyService來處理業務

2、 ConsumeMessageOrderlyService.ConsumeRequest

0ed789f0-4837-11ec-b939-dac502259ad0.jpg

從ConcurrentMap中獲取messageQueue對應的鎖對象

通過 synchronized 關鍵字,線程來搶占鎖,互斥關系,從而保證了一個MessageQueue只能有一個線程并發處理

繼續往下看,如果擴容了怎么辦?

原來有6個分區,order_id_1的消息在MessageQueue6 中,此時擴容一倍,現在12個分區,order_id_1訂單后面產生的消息可能路由到了MessageQueue8 中,同一個訂單的消息分布在兩個分區中,無法保證順序。

我們能做的是,先將存量消息處理完,再擴容。如果是在線業務,可以搞個臨時topic,先將消息暫時堆積,待擴容后,按新的路由規則重新發送。

順序消息,如果某條失敗了怎么辦?會不會一直阻塞?

1、如果失敗,不會提交消費位移,系統會自動重試(有重試上限),此時會阻塞后面的消息消費,直到這條消息處理完

2、如果這個消息達到重試上限,依然失敗,會進入死信隊列,可以繼續處理后面的消息

責任編輯:haq

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 數據
    +關注

    關注

    8

    文章

    7335

    瀏覽量

    94778
  • 框架
    +關注

    關注

    0

    文章

    404

    瀏覽量

    18425

原文標題:面試官問: 如何保證 MQ 消息是有序的?

文章出處:【微信號:DBDevs,微信公眾號:數據分析與開發】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    探索MAX25605:汽車照明系統的6開關順序LED控制器

    探索MAX25605:汽車照明系統的6開關順序LED控制器 作為電子工程師,在汽車照明系統設計中,我們總是在尋找高性能、高可靠性且易于配置的LED控制器。Maxim Integrated
    的頭像 發表于 01-30 16:10 ?144次閱讀

    EtherCAT總線節點順序錯誤問題詳解

    ,總線節點順序錯誤是工程師常遇到的典型問題之一。本文將深入剖析該問題的成因、診斷方法及解決方案,并結合實際案例提供系統性指導。 一、EtherCAT總線拓撲與節點順序原理 EtherCAT支持線型、樹型
    的頭像 發表于 12-27 07:39 ?57次閱讀
    EtherCAT總線節點<b class='flag-5'>順序</b>錯誤問題詳解

    MSN12AD20-MQ:與TI、Intel等品牌電源模塊的對比及替代方案解析

    MSN12AD20-MQ:與TI、Intel等品牌電源模塊的對比及替代方案解析MSN12AD20-MQ 與德州儀器(TI)TPSM843B22、Intel Enpirion EM2120LxQI
    發表于 12-18 10:14

    廣和通小尺寸低功耗Cat.M模組MQ771-GL實現送樣,專注資產追蹤應用

    11月,廣和通宣布Cat.M模組MQ771-GL正式進入工程送樣階段。MQ771-GL憑借極致尺寸、超低功耗、全球頻段覆蓋和穩定網絡兼容性四大核心優勢,為資產追蹤等物聯網場景提供高性價比的連接
    的頭像 發表于 11-20 10:59 ?326次閱讀
    廣和通小尺寸低功耗Cat.M模組<b class='flag-5'>MQ</b>771-GL實現送樣,專注資產追蹤應用

    MPN12AD160-MQ:替代ADI/TI/TOREX電源芯片

    MPN12AD160-MQ是Cyntec(乾坤)推出的大電流微型POL DC-DC電源模塊,專為 AI/GPU 板卡等高功耗、高密度場景打造,集成兩顆 DC-DC 芯片,采用雙相 60A 并聯
    發表于 11-20 10:09

    rt_mq_recv函數中timeout作用是什么?

    請參看附件和圖片, rt_mq_recv() 函數while (mq-&gt;entry == 0)代碼塊中會去檢查timeout值,重新計算timeout,但timeout重新計算
    發表于 09-29 06:27

    當rt_mq_recv()指定超時時間時,多個線程用這個函數時,會發生死機現象,怎么解決?

    求助,我做了8個線程,都在用rt_mq_recv(a,b,c,50)指定的超時時間等待自已的隊列消息,同時觸發同時調用時,會出現死機現象,有沒有人遇到過?
    發表于 09-29 06:00

    rt_msgqueue rt_mq_recv()接收卡死的原因?

    在使用消息隊列rt_mq_recv時候卡死 static struct rt_messagequeue TX_CanMsg_mq; __attribute__((aligned (4
    發表于 09-10 07:47

    新品|Unit MQ,可燃氣體檢測單元

    UnitMQ是一款基于半導體氣體傳感器(MQ-5)設計的可燃氣體檢測單元,內部集成了MCU(STM32G030F6P6),主要用于環境中可燃氣體(如丙烷、甲烷等)的檢測。該單元可通過I2C通信接口
    的頭像 發表于 08-29 17:48 ?667次閱讀
    新品|Unit <b class='flag-5'>MQ</b>,可燃氣體檢測單元

    【米爾RK3576開發板免費體驗】集成MQ-2煙霧傳感器和ADS1263模塊實現氣體監測

    ADC(38kSPS采樣) MQ-2傳感器 模擬輸入 ADC0或擴展ADC接口 檢測可燃氣體/煙 電源 :MQ-2需5V供電(開發板GPIO提供),ADS1263需3.3V。傳感器接入AD接口如圖
    發表于 08-28 10:22

    Texas Instruments LMR43606MQ3EVM-2M評估模塊數據手冊

    Texas Instruments LMR43606MQ3EVM-2M評估模塊是一個經過全面組裝和測試的電路,用于評估LMR43606-Q1降壓型電壓轉換器。該模塊的輸入電壓范圍為3.5V至36V
    的頭像 發表于 08-02 09:52 ?1166次閱讀
    Texas Instruments LMR43606<b class='flag-5'>MQ</b>3EVM-2M評估模塊數據手冊

    單片機實例項目:MQ系列模塊資料

    單片機實例項目:MQ系列模塊資料,推薦下載!
    發表于 06-03 21:11

    從信號到散熱:多層板壓合順序的性能影響全解讀

    多層板壓合順序會對成品性能產生影響,以下是捷多邦的具體分析: 影響信號完整性:不同的壓合順序可能導致層間介質厚度不均勻,從而使信號傳輸的特性阻抗發生變化。如果特性阻抗不連續,信號在傳輸
    的頭像 發表于 05-11 10:29 ?766次閱讀

    設備與電源濾波器連接時,接線順序有的基本要求

    電源濾波器是現代電子設備的必備組件,連接時應遵循接線順序,確保輸入、輸出端的區分和正確連接地線。接線前需確保設備和電源濾波器完全斷電、外觀完好無損,工具準備充分。接線順序包括輸入端與輸出端的區分、輸入端接線順序和輸出端接線
    的頭像 發表于 04-08 17:44 ?1631次閱讀
    設備與電源濾波器連接時,接線<b class='flag-5'>順序</b>有的基本要求

    廣和通發布小尺寸Cat.M模組MQ780-GL

    近日,在2025世界移動通信大會(MWC Barcelona 2025)期間,廣和通發布基于高通E51 4G調制解調器及射頻方案的小尺寸Cat.M模組MQ780-GL。MQ780-GL憑借極致尺寸
    的頭像 發表于 03-12 09:13 ?1159次閱讀