欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

RocketMQ的順序消費機制詳解

 更新時間:2023年10月11日 10:56:52   作者:Java愛好狂.  
這篇文章主要介紹了RocketMQ的順序消費機制詳解,順序消息是指對于一個指定的?Topic?,消息嚴(yán)格按照先進(jìn)先出(FIFO)的原則進(jìn)行消息發(fā)布和消費,即先發(fā)布的消息先消費,后發(fā)布的消息后消費,,需要的朋友可以參考下

前言

順序消息是指對于一個指定的 Topic ,消息嚴(yán)格按照先進(jìn)先出(FIFO)的原則進(jìn)行消息發(fā)布和消費,即先發(fā)布的消息先消費,后發(fā)布的消息后消費。

順序消息分為分區(qū)順序消息全局順序消息

1、分區(qū)順序消息

對于指定的一個 Topic ,所有消息根據(jù) Sharding Key 進(jìn)行區(qū)塊分區(qū),同一個分區(qū)內(nèi)的消息按照嚴(yán)格的先進(jìn)先出(FIFO)原則進(jìn)行發(fā)布和消費。同一分區(qū)內(nèi)的消息保證順序,不同分區(qū)之間的消息順序不做要求。

  • 適用場景:適用于性能要求高,以 Sharding Key 作為分區(qū)字段,在同一個區(qū)塊中嚴(yán)格地按照先進(jìn)先出(FIFO)原則進(jìn)行消息發(fā)布和消費的場景。
  • 示例:電商的訂單創(chuàng)建,以訂單 ID 作為 Sharding Key ,那么同一個訂單相關(guān)的創(chuàng)建訂單消息、訂單支付消息、訂單退款消息、訂單物流消息都會按照發(fā)布的先后順序來消費。

2、全局順序消息

對于指定的一個 Topic ,所有消息按照嚴(yán)格的先入先出(FIFO)的順序來發(fā)布和消費。

  • 適用場景:適用于性能要求不高,所有的消息嚴(yán)格按照 FIFO 原則來發(fā)布和消費的場景。
  • 示例:在證券處理中,以人民幣兌換美元為 Topic,在價格相同的情況下,先出價者優(yōu)先處理,則可以按照 FIFO 的方式發(fā)布和消費全局順序消息。

全局順序消息實際上是一種特殊的分區(qū)順序消息,即 Topic 中只有一個分區(qū),因此全局順序和分區(qū)順序的實現(xiàn)原理相同。

因為分區(qū)順序消息有多個分區(qū),所以分區(qū)順序消息比全局順序消息的并發(fā)度和性能更高。

消息的順序需要由兩個階段保證:

消息發(fā)送

如上圖所示,A1、B1、A2、A3、B2、B3 是訂單 A 和訂單 B 的消息產(chǎn)生的順序,業(yè)務(wù)上要求同一訂單的消息保持順序,例如訂單 A 的消息發(fā)送和消費都按照 A1、A2、A3 的順序。

如果是普通消息,訂單A 的消息可能會被輪詢發(fā)送到不同的隊列中,不同隊列的消息將無法保持順序,而順序消息發(fā)送時 RocketMQ 支持將 Sharding Key 相同(例如同一訂單號)的消息序路由到一個隊列中。

消息消費

消費者消費消息時,需要保證消息消費順序和存儲順序一致,最終實現(xiàn)消費順序和發(fā)布順序的一致。

我們知道負(fù)載均衡服務(wù)是客戶端開始消費的起點。在負(fù)載均衡階段,并發(fā)消費和順序消費并沒有什么大的差別,最大的差別在于:向 Borker 申請鎖

消費者根據(jù)分配的隊列 messageQueue ,向 Borker 申請鎖 ,如果申請成功,則會拉取消息,如果失敗,則定時任務(wù)每隔20秒會重新嘗試。

見上圖,順序消費核心流程如下:

1、 組裝成消費對象

消費快照 processQueue + 消息隊列對象 MessageQueue

2、 將請求對象提交到消費線程池

和并發(fā)消費不同的是,這里的消費請求包含消費快照 processQueue ,消息隊列 messageQueue 兩個對象,并不對消息列表做任何處理。

3、 消費線程內(nèi),對消費隊列加鎖

4、 從消費快照中取得待消費的消息列表

消費快照 processQueue 對象里,創(chuàng)建了一個紅黑樹對象 consumingMsgOrderlyTreeMap 用于臨時存儲的待消費的消息。

5、 執(zhí)行消息監(jiān)聽器

執(zhí)行監(jiān)聽器邏輯容易理解,消費快照的消費鎖 consumeLock的作用是:防止 Rebalance 線程把當(dāng)前消費的 MessageQueue 對象移除掉。

6、 處理消費結(jié)果

消費成功時,首先計算需要提交的偏移量,然后更新本地消費進(jìn)度。

消費失敗時,分兩種場景:

  • 假如已消費次數(shù)小于最大重試次數(shù),則將放入對象 consumingMsgOrderlyTreeMap 用例臨時存儲的待消費的消息,重新加入到消費快照紅黑樹 msgTreeMap中,然后使用定時任務(wù)嘗試重新消費。
  • 假如已消費次數(shù)大于等于最大重試次數(shù),則將失敗消息發(fā)送到 Broker ,Broker 接收到消息后,會加入到死信隊列里 , 最后計算需要提交的偏移量,然后更新本地消費進(jìn)度。

我們做一個關(guān)于順序消費的總結(jié):

  1. 順序消費需要由兩個階段消息發(fā)送和消息消費協(xié)同配合,底層支撐依靠的是 RocketMQ 的存儲模型;
  2. 順序消費服務(wù)啟動后,通過三把鎖的機制,消息隊列 messageQueue 的數(shù)據(jù)都會被消費者實例單線程的執(zhí)行消費;
  3. 假如消費者擴容,消費者重啟,或者 Broker 宕機 ,順序消費也會有一定幾率較短時間內(nèi)亂序,所以消費者的業(yè)務(wù)邏輯還是要保障冪等。

到此這篇關(guān)于RocketMQ的順序消費機制詳解的文章就介紹到這了,更多相關(guān)RocketMQ的順序消費內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringBoot整合Redisson的步驟(單機版)

    SpringBoot整合Redisson的步驟(單機版)

    Redisson非常適用于分布式鎖,而我們的一項業(yè)務(wù)需要考慮分布式鎖這個應(yīng)用場景,于是我整合它做一個初步簡單的例子(和整合redis一樣)。
    2021-05-05
  • Java中YYYY-MM-dd與yyyy-MM-dd的區(qū)別及跨年問題

    Java中YYYY-MM-dd與yyyy-MM-dd的區(qū)別及跨年問題

    YYYY-MM-dd可能會導(dǎo)致跨年周的日期被歸屬到錯誤的年份, yyyy-MM-dd總是表示實際的日歷年份,無論日期所在的周是否跨年,本文就來介紹一下兩者的區(qū)別,感興趣的可以了解一下
    2024-01-01
  • 淺談java 重寫equals方法的種種坑

    淺談java 重寫equals方法的種種坑

    這篇文章主要介紹了淺談java 重寫equals方法的種種“坑”,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • java反射方式創(chuàng)建代碼詳解

    java反射方式創(chuàng)建代碼詳解

    在本篇文章里小編給大家整理的是一篇關(guān)于java反射方式創(chuàng)建代碼詳解內(nèi)容,對此有興趣的朋友們可以學(xué)習(xí)下。
    2021-01-01
  • java實現(xiàn)轉(zhuǎn)圈打印矩陣算法

    java實現(xiàn)轉(zhuǎn)圈打印矩陣算法

    這篇文章主要為大家詳細(xì)介紹了java實現(xiàn)轉(zhuǎn)圈打印矩陣算法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-03-03
  • Idea中Jdk和Language level的指定方式

    Idea中Jdk和Language level的指定方式

    這篇文章主要介紹了Idea中Jdk和Language level的指定方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-04-04
  • 深入了解java8的foreach循環(huán)

    深入了解java8的foreach循環(huán)

    雖然java8出來很久了,但是之前用的一直也不多,最近正好學(xué)習(xí)了java8。下面給大家分享java8中的foreach循環(huán),感興趣的朋友一起看看吧
    2017-05-05
  • 教你Spring如何使用三級緩存解決循環(huán)依賴

    教你Spring如何使用三級緩存解決循環(huán)依賴

    這篇文章主要介紹了Spring使用三級緩存解決循環(huán)依賴的過程,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-03-03
  • Java 中ConcurrentHashMap的實現(xiàn)

    Java 中ConcurrentHashMap的實現(xiàn)

    本文主要介紹Java 中ConcurrentHashMap的實現(xiàn),這里整理了詳細(xì)的資料,及簡單實例代碼,有興趣的小伙伴可以參考下
    2016-09-09
  • Jackson常用方法以及jacksonUtil工具類詳解

    Jackson常用方法以及jacksonUtil工具類詳解

    這篇文章主要介紹了Jackson常用方法以及jacksonUtil工具類詳解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06

最新評論