91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何解決回到MQ的消息順序問(wèn)題

數(shù)據(jù)分析與開發(fā) ? 來(lái)源:微觀技術(shù) ? 作者:微觀技術(shù) ? 2021-11-18 16:07 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

為了系統(tǒng)間解耦,我們通常會(huì)引入MQ框架,大家各司其職共同完成上下游的業(yè)務(wù)流程。

大致過(guò)程:

生產(chǎn)端,創(chuàng)建一條消息,通過(guò)網(wǎng)絡(luò)發(fā)送到MQ Server

MQ將 消息存儲(chǔ)在topic 的一個(gè)分區(qū)里

消費(fèi)端,從分區(qū)中拉取消息,消費(fèi)處理

但現(xiàn)實(shí)往往不一樣!MQ 架構(gòu)設(shè)計(jì)要滿足高并發(fā)、高性能、高可用等指標(biāo)

單分區(qū),達(dá)不到我們的吞吐量要求,我們考慮采用多分區(qū)架構(gòu)設(shè)計(jì),正所謂 ”三個(gè)臭皮匠賽過(guò)一個(gè)諸葛亮“,多分區(qū)可以有效分?jǐn)側(cè)謮毫Γ嵘w系統(tǒng)性能。

兩臺(tái) MQ機(jī)器,組成一個(gè)集群,原先一個(gè)分區(qū)存儲(chǔ)6條消息,現(xiàn)在分?jǐn)偟絻蓚€(gè)分區(qū),每個(gè)分區(qū)各存儲(chǔ)3條消息,性能比上面那個(gè)提升一倍。

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

我們看看下面業(yè)務(wù)場(chǎng)景:

一個(gè)用戶在電商網(wǎng)站上下訂單到交易完成,中間會(huì)經(jīng)歷一系列動(dòng)作,訂單的狀態(tài)也會(huì)隨之變化,一個(gè)訂單會(huì)產(chǎn)生多條MQ消息,下單、付款、發(fā)貨、買家確認(rèn)收貨,消費(fèi)端需要嚴(yán)格按照業(yè)務(wù)狀態(tài)機(jī)的順序處理,否則,就會(huì)出現(xiàn)業(yè)務(wù)問(wèn)題。

我們發(fā)現(xiàn),消息帶上了狀態(tài),不再是一個(gè)個(gè)獨(dú)立的個(gè)體,有了上下文依賴關(guān)系!

對(duì)于這個(gè)問(wèn)題,突然想到HTTP協(xié)議,其本身也是無(wú)狀態(tài)的,也就是說(shuō)前后兩次請(qǐng)求沒有關(guān)聯(lián),但有些業(yè)務(wù)功能有登錄要求,那怎么解決?

引入Cookie機(jī)制,每次請(qǐng)求客戶端額外傳輸一些數(shù)據(jù),來(lái)達(dá)到上下文關(guān)聯(lián)。

回到MQ的消息順序問(wèn)題,我們要如何解決?

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

比如上面的電商例子,只要保證一個(gè)訂單的多條狀態(tài)消息在同一個(gè)分區(qū),便可以滿足業(yè)務(wù)需求,這個(gè)方案可以覆蓋大部分的業(yè)務(wù)場(chǎng)景。

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

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

接下來(lái),我們以 RocketMQ 為例:

生產(chǎn)端提供了一個(gè)接口 MessageQueueSelector

public interface MessageQueueSelector {

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

}

接口內(nèi)定義一個(gè)select方法,具體參數(shù)含義:

mqs:該Topic下所有的隊(duì)列分片

msg:待發(fā)送的消息

arg:發(fā)送消息時(shí)傳遞的參數(shù)

關(guān)于MessageQueueSelector接口,RocketMQ 框架提供了三個(gè)默認(rèn)實(shí)現(xiàn)類:

1、SelectMessageQueueByHash:

arg參數(shù)的hashcode的絕對(duì)值,然后對(duì)mqs.size()取余,得到目標(biāo)隊(duì)列在mqs的下標(biāo)

2、SelectMessageQueueByRandom:

對(duì)mqs.size()值取隨機(jī)數(shù)作為目標(biāo)隊(duì)列在mqs的下標(biāo)

3、SelectMessageQueueByMachineRoom

返回null

特別注意:

雖然保證了單個(gè)分片的消息有序,但每個(gè)分片的消費(fèi)者只能是單線程處理,因?yàn)槎嗑€程無(wú)法控制消費(fèi)順序。這個(gè)可能會(huì)損失一些性能。

這里又引出另一個(gè)問(wèn)題,如何保證一個(gè)隊(duì)列只能有一個(gè)消費(fèi)端呢?

1、

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

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

遍歷一個(gè)topic下所有的MessageQueue

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

2、將PullRequest對(duì)象放入PullMessageService的pullRequestQueue隊(duì)列中

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 是一個(gè)Runnable線程任務(wù)

無(wú)限循環(huán),從隊(duì)列中拉取、處理消息

另一個(gè)問(wèn)題,如何保證一個(gè)隊(duì)列,只有一個(gè)線程在處理消息呢?

1、 DefaultMQPushConsumerImpl#pullMessage

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

ConsumeMessageService 中有兩個(gè)實(shí)現(xiàn)類,因?yàn)槲覀冇邢M(fèi)順序要求,會(huì)選擇ConsumeMessageOrderlyService來(lái)處理業(yè)務(wù)

2、 ConsumeMessageOrderlyService.ConsumeRequest

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

從ConcurrentMap中獲取messageQueue對(duì)應(yīng)的鎖對(duì)象

通過(guò) synchronized 關(guān)鍵字,線程來(lái)?yè)屨兼i,互斥關(guān)系,從而保證了一個(gè)MessageQueue只能有一個(gè)線程并發(fā)處理

繼續(xù)往下看,如果擴(kuò)容了怎么辦?

原來(lái)有6個(gè)分區(qū),order_id_1的消息在MessageQueue6 中,此時(shí)擴(kuò)容一倍,現(xiàn)在12個(gè)分區(qū),order_id_1訂單后面產(chǎn)生的消息可能路由到了MessageQueue8 中,同一個(gè)訂單的消息分布在兩個(gè)分區(qū)中,無(wú)法保證順序。

我們能做的是,先將存量消息處理完,再擴(kuò)容。如果是在線業(yè)務(wù),可以搞個(gè)臨時(shí)topic,先將消息暫時(shí)堆積,待擴(kuò)容后,按新的路由規(guī)則重新發(fā)送。

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

1、如果失敗,不會(huì)提交消費(fèi)位移,系統(tǒng)會(huì)自動(dòng)重試(有重試上限),此時(shí)會(huì)阻塞后面的消息消費(fèi),直到這條消息處理完

2、如果這個(gè)消息達(dá)到重試上限,依然失敗,會(huì)進(jìn)入死信隊(duì)列,可以繼續(xù)處理后面的消息

責(zé)任編輯:haq

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 數(shù)據(jù)
    +關(guān)注

    關(guān)注

    8

    文章

    7340

    瀏覽量

    94886
  • 框架
    +關(guān)注

    關(guān)注

    0

    文章

    404

    瀏覽量

    18466

原文標(biāo)題:面試官問(wèn): 如何保證 MQ 消息是有序的?

文章出處:【微信號(hào):DBDevs,微信公眾號(hào):數(shù)據(jù)分析與開發(fā)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    廣和通MQ771-GL重新定義智能寵物項(xiàng)圈

    隨著寵物主對(duì)“科學(xué)養(yǎng)寵”需求的不斷升級(jí),寵物項(xiàng)圈已不再僅僅是身份標(biāo)識(shí),而是集定位、健康監(jiān)測(cè)、行為分析于一體的智能終端。廣和通 MQ771-GL 憑借多個(gè)核心優(yōu)勢(shì),完美契合這一垂直市場(chǎng)的嚴(yán)苛要求。
    的頭像 發(fā)表于 03-16 10:09 ?191次閱讀
    廣和通<b class='flag-5'>MQ</b>771-GL重新定義智能寵物項(xiàng)圈

    探索MAX25605:汽車照明系統(tǒng)的6開關(guān)順序LED控制器

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

    EtherCAT總線節(jié)點(diǎn)順序錯(cuò)誤問(wèn)題詳解

    ,總線節(jié)點(diǎn)順序錯(cuò)誤是工程師常遇到的典型問(wèn)題之一。本文將深入剖析該問(wèn)題的成因、診斷方法及解決方案,并結(jié)合實(shí)際案例提供系統(tǒng)性指導(dǎo)。 一、EtherCAT總線拓?fù)渑c節(jié)點(diǎn)順序原理 EtherCAT支持線型、樹型
    的頭像 發(fā)表于 12-27 07:39 ?135次閱讀
    EtherCAT總線節(jié)點(diǎn)<b class='flag-5'>順序</b>錯(cuò)誤問(wèn)題詳解

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

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

    廣和通小尺寸低功耗Cat.M模組MQ771-GL實(shí)現(xiàn)送樣,專注資產(chǎn)追蹤應(yīng)用

    11月,廣和通宣布Cat.M模組MQ771-GL正式進(jìn)入工程送樣階段。MQ771-GL憑借極致尺寸、超低功耗、全球頻段覆蓋和穩(wěn)定網(wǎng)絡(luò)兼容性四大核心優(yōu)勢(shì),為資產(chǎn)追蹤等物聯(lián)網(wǎng)場(chǎng)景提供高性價(jià)比的連接
    的頭像 發(fā)表于 11-20 10:59 ?396次閱讀
    廣和通小尺寸低功耗Cat.M模組<b class='flag-5'>MQ</b>771-GL實(shí)現(xiàn)送樣,專注資產(chǎn)追蹤應(yīng)用

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

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

    rt_mq_recv函數(shù)中timeout作用是什么?

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

    當(dāng)rt_mq_recv()指定超時(shí)時(shí)間時(shí),多個(gè)線程用這個(gè)函數(shù)時(shí),會(huì)發(fā)生死機(jī)現(xiàn)象,怎么解決?

    求助,我做了8個(gè)線程,都在用rt_mq_recv(a,b,c,50)指定的超時(shí)時(shí)間等待自已的隊(duì)列消息,同時(shí)觸發(fā)同時(shí)調(diào)用時(shí),會(huì)出現(xiàn)死機(jī)現(xiàn)象,有沒有人遇到過(guò)?
    發(fā)表于 09-29 06:00

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

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

    新品|Unit MQ,可燃?xì)怏w檢測(cè)單元

    UnitMQ是一款基于半導(dǎo)體氣體傳感器(MQ-5)設(shè)計(jì)的可燃?xì)怏w檢測(cè)單元,內(nèi)部集成了MCU(STM32G030F6P6),主要用于環(huán)境中可燃?xì)怏w(如丙烷、甲烷等)的檢測(cè)。該單元可通過(guò)I2C通信接口
    的頭像 發(fā)表于 08-29 17:48 ?702次閱讀
    新品|Unit <b class='flag-5'>MQ</b>,可燃?xì)怏w檢測(cè)單元

    【米爾RK3576開發(fā)板免費(fèi)體驗(yàn)】集成MQ-2煙霧傳感器和ADS1263模塊實(shí)現(xiàn)氣體監(jiān)測(cè)

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

    Texas Instruments LMR43606MQ3EVM-2M評(píng)估模塊數(shù)據(jù)手冊(cè)

    Texas Instruments LMR43606MQ3EVM-2M評(píng)估模塊是一個(gè)經(jīng)過(guò)全面組裝和測(cè)試的電路,用于評(píng)估LMR43606-Q1降壓型電壓轉(zhuǎn)換器。該模塊的輸入電壓范圍為3.5V至36V
    的頭像 發(fā)表于 08-02 09:52 ?1217次閱讀
    Texas Instruments LMR43606<b class='flag-5'>MQ</b>3EVM-2M評(píng)估模塊數(shù)據(jù)手冊(cè)

    單片機(jī)實(shí)例項(xiàng)目:MQ系列模塊資料

    單片機(jī)實(shí)例項(xiàng)目:MQ系列模塊資料,推薦下載!
    發(fā)表于 06-03 21:11

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

    多層板壓合順序會(huì)對(duì)成品性能產(chǎn)生影響,以下是捷多邦的具體分析: 影響信號(hào)完整性:不同的壓合順序可能導(dǎo)致層間介質(zhì)厚度不均勻,從而使信號(hào)傳輸?shù)奶匦宰杩拱l(fā)生變化。如果特性阻抗不連續(xù),信號(hào)在傳輸
    的頭像 發(fā)表于 05-11 10:29 ?819次閱讀

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

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