女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

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

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

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

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

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

掃碼添加小助手

加入工程師交流群

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

大致過程:

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

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

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

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

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

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

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

我們看看下面業(yè)務場景:

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

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

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

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

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

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

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

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

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

接下來,我們以 RocketMQ 為例:

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

public interface MessageQueueSelector {

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

}

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

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

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

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

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

1、SelectMessageQueueByHash:

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

2、SelectMessageQueueByRandom:

對mqs.size()值取隨機數(shù)作為目標隊列在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線程任務

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

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

1、 DefaultMQPushConsumerImpl#pullMessage

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

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

2、 ConsumeMessageOrderlyService.ConsumeRequest

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

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

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

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

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

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

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

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

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

責任編輯:haq

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

    關注

    8

    文章

    7256

    瀏覽量

    91836
  • 框架
    +關注

    關注

    0

    文章

    404

    瀏覽量

    17892

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

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

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

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

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

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

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

    網(wǎng)線順序怎么排

    網(wǎng)線的順序排列主要遵循TIA/EIA-568A和TIA/EIA-568B這兩種主流標準,其中TIA/EIA-568B標準更為常用。以下是關于網(wǎng)線順序排列的詳細解釋: 一、TIA/EIA-568B標準
    的頭像 發(fā)表于 03-07 10:36 ?2284次閱讀

    DLP3010投影亂序如何解決?

    是對的,所以相機捕獲正常,由于相機捕獲的東西是運動的,從運動軌跡可以判定相機采集的順序是對的。 所以請教一下該如何解決?
    發(fā)表于 02-26 07:05

    網(wǎng)線的順序顏色排位

    網(wǎng)線的順序顏色排位通常遵循TIA/EIA 568B或TIA/EIA 568A標準,以下是這兩種標準的詳細顏色排位: TIA/EIA 568B標準 這是最常用的網(wǎng)線顏色排位標準,具體順序如下: 橙白線
    的頭像 發(fā)表于 02-20 09:46 ?2452次閱讀

    磁極是如何解決磁集成產(chǎn)品電磁干擾的?

    磁集成后,有哪些新的電磁干擾源?該如何解決這些新的干擾源?磁極又是如何解決這些問題的? 磁集成后,EMC比分立磁性元件更難通過,到底是什么原因?qū)е碌模看判栽髽I(yè)又有哪些辦法可以解決?今天我們采訪
    的頭像 發(fā)表于 12-06 11:27 ?680次閱讀
    磁極是如<b class='flag-5'>何解</b>決磁集成產(chǎn)品電磁干擾的?

    MQ消息亂序問題解析與實戰(zhàn)解決方案

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

    網(wǎng)線接線順序

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

    AOD5B65MQ1E快恢復二極管英文手冊

    電子發(fā)燒友網(wǎng)站提供《AOD5B65MQ1E快恢復二極管英文手冊.pdf》資料免費下載
    發(fā)表于 11-28 15:56 ?0次下載

    運算放大器LMH6733MQ的最小輸入電壓是多少?

    你好請問一下運算放大器LMH6733MQ的最小輸入電壓是多少? 這個運放工作是否穩(wěn)定?
    發(fā)表于 09-24 06:55

    何解決熱插拔時的電壓過沖

    電子發(fā)燒友網(wǎng)站提供《如何解決熱插拔時的電壓過沖.pdf》資料免費下載
    發(fā)表于 09-06 11:34 ?0次下載
    如<b class='flag-5'>何解</b>決熱插拔時的電壓過沖

    8根網(wǎng)線的接法顏色順序

    8根網(wǎng)線的接法顏色順序主要有兩種標準:568A和568B。這兩種標準在實際應用中略有不同,但都以網(wǎng)線內(nèi)部的顏色來區(qū)分排序。 568A標準 在568A標準中,8根網(wǎng)線的顏色順序從左到右(通常以水晶頭有
    的頭像 發(fā)表于 09-06 09:46 ?4455次閱讀

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

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

    何解決電感的漏感問題

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

    網(wǎng)線b類接線順序詳細解釋

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