色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

    文章

    7002

    瀏覽量

    88943
  • 框架
    +關注

    關注

    0

    文章

    403

    瀏覽量

    17475

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

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

收藏 人收藏

    評論

    相關推薦

    MQ消息亂序問題解析與實戰解決方案

    作者:京東物流 劉浩 1. 背景 在分布式系統中,消息隊列(MQ)是實現系統解耦、異步通信的重要工具。然而,MQ消費時出現的消息亂序問題,經常會對業務邏輯的正確執行和系統穩定性產生不良影響。本文將
    的頭像 發表于 12-06 09:46 ?166次閱讀

    網線接線順序

    網線的接線順序一般遵循TIA/EIA 568B或TIA/EIA 568A標準。以下是這兩種標準的詳細接線順序: TIA/EIA 568B標準 TIA/EIA 568B標準是最常用的網線接線順序之一
    的頭像 發表于 12-03 09:40 ?139次閱讀

    何解決工字電感噪音大的問題

    電子發燒友網站提供《如何解決工字電感噪音大的問題.docx》資料免費下載
    發表于 09-04 11:46 ?0次下載

    何解決電感的漏感問題

    電子發燒友網站提供《如何解決電感的漏感問題.docx》資料免費下載
    發表于 09-02 14:48 ?0次下載

    網線b類接線順序詳細解釋

    網線B類接線順序,即按照T568B標準進行接線的順序,具體為:白橙、橙、白綠、藍、白藍、綠、白棕、棕。這個順序是指網線兩端水晶頭中8根線的排列順序。以下是對網線B類接線
    的頭像 發表于 07-19 10:15 ?8376次閱讀

    mq-2傳感器與esp32cam wifi有沖突怎么解決?

    一、只要esp32cam 開啟wifi功能,mq-2傳感器一直返回4095,去掉mq-2傳感器,也是一直返回4095。 二、代碼中去掉wifi功能,返回為動態變化的值。 三、排除了傳感器損壞、電壓不穩等情況 四、也排除了wifi功能,代碼問題 五、懷疑是wifi與
    發表于 07-02 07:56

    電解池中電極的放電順序

    在電解池中,電極的放電順序,也就是電極上發生氧化還原反應的順序,是由電極材料的化學性質和電解質的性質共同決定的。
    的頭像 發表于 04-28 15:29 ?1499次閱讀

    MQ-2煙霧傳感器的輸出阻抗和STM32 ADC的輸入電阻大概多大呢?

    MQ-2煙霧傳感器輸出電壓較大,故需分壓。 MQ-2煙霧傳感器的輸出阻抗和STM32 ADC的輸入電阻大概多大呢? 分壓時考慮到MQ-2煙霧傳感器的輸出阻抗和STM32 ADC的輸入電阻問題,則在分壓的時候如何設置分壓電阻的大小
    發表于 04-11 08:14

    用STM32F4和一個煙霧傳感器(MQ-2)模塊相連,STM32F4板子的電壓不能超過3.3V如何解決?

    問題: 想用STM32F4和一個煙霧傳感器(MQ-2)模塊相連,但MQ-2模塊的輸出電壓范圍是0——5V,STM32F4板子的電壓不能超過3.3V,請問該如何解決?
    發表于 04-11 06:33

    PLC順序啟動逆順序停止電路如何運行

    了解了順序啟動電路,今天再來看看順序啟動逆順序停止電路如何運行。
    發表于 04-09 14:13 ?763次閱讀
    PLC<b class='flag-5'>順序</b>啟動逆<b class='flag-5'>順序</b>停止電路如何運行

    集成芯片引腳順序

    集成芯片的引腳順序一般遵循特定的排列規則,以確保電路的正常工作。不同的芯片型號和封裝方式可能有不同的引腳排列方式。
    的頭像 發表于 03-19 17:18 ?2139次閱讀

    煤氣柜泄漏問題如何解

    電子發燒友網站提供《煤氣柜泄漏問題如何解決.docx》資料免費下載
    發表于 03-05 17:49 ?0次下載

    何解決鍵槽滾鍵磨損問題

    電子發燒友網站提供《如何解決鍵槽滾鍵磨損問題.docx》資料免費下載
    發表于 02-04 14:24 ?0次下載

    Redis可以實現消息中間件MQ的功能

    是一種通信模式:發送者(PUBLISH)發送消息,訂閱者(SUBSCRIBE)接收消息,可以實現進程間的消息傳遞   Redis可以實現消息中間件MQ的功能,通過發布訂閱實現消息的引導和分流
    的頭像 發表于 01-25 14:48 ?926次閱讀
    Redis可以實現消息中間件<b class='flag-5'>MQ</b>的功能

    ADAS1000數據讀取后DRDY引腳無法回到高電平的情況應該如何解決?

    排除所燒錄的程序問題,請問出現這種故障應該如何解決,硬件電路連接相比較之前沒有做出改變,但PCB的走線可能有所變化,請問走線的變化是否會引起這種變化?目前ADAS1000數據讀取后DRDY引腳無法回到高電平的情況應該如何解決?
    發表于 12-27 08:06
    主站蜘蛛池模板: 91av影院| 国产亚洲精品久久777777| 乱淫67194| 亚洲视频成人| 极品美女穴| 美女胸网站| 中文字幕精品AV内射夜夜夜| 超级最爽的乱淫片免费| 依恋影院在线观看| 国产亚洲精品黑人粗大精选| 我就去色色| 高h超辣bl文| 日韩一区二区三区四区区区| av亚洲2017色天堂| 你是淫荡的我的女王| av亚洲色天堂2017| 黑人巨大两根一起挤进欧美| 小草观看免费高清视频| 国产精品久久自在自2021| 色婷婷我要去我去也| 顶级欧美不卡一区二区三区| 日本超A大片在线观看| 成人免费无毒在线观看网站| 日本超A大片在线观看| 成年人国产视频| 日韩精品免费在线观看| 成人在线高清不卡免费视频| 欧美日韩另类在线观看视频| chinesetoilet美女沟| 年轻的母亲4线在线观看完整| 97人妻精品全国免费视频| 蜜芽tv在线www| 99热这里只有是精品| 欧美在线看欧美视频免费| 成人性生交大片免费看金瓶七仙女| 日韩免费一区二区三区在线| 大咪咪dvd| 小荡娃奶真大| 黄色三级网站| 中文字幕乱码在线人视频| 迈开腿让我看下你的小草莓声音|