【消息隊列】——如何實現消息保序

目錄

    • 一、哪些場景需要消息保序?
    • 二、如何實現消息保序?
    • 三、保序消息的常見問題和應對策略
      • 3.1、重復消息
      • 3.2、節點故障
      • 3.3、分區擴容
    • 四、小結

本文來源:極客時間vip課程筆記

一、哪些場景需要消息保序?

  • 消息保序問題指的是,在通過消息中間件傳遞消息過程中,我們希望消費者收到消息的順序,和發送者發送消息的順序保持一致。或者說,消息中間件在傳遞消息時,不要改變消息之間的順序。
  • 過在工程實踐中,我們面臨的保序問題不一定只是局限在消息保序這一個環節,更常見的場景是,事件經過包含消息隊列等多個環節的處理和傳遞后,在某個服務內能夠按照事件發生的順序來逐個處理這些事件,不發生亂序。比如:
    (1)、在證券、股票交易撮合場景中,對于出價相同的交易單,需要堅持按照先出價先交易的原則,下游處理訂單的系統需要嚴格按照出價順序來處理訂單。
    (2)、在數據庫變更增量同步場景中,上游源端數據庫按需執行增刪改操作,將 BINLOG 作為消息,通過消息隊列傳輸到下游系統,下游系統按順序還原消息數據,實現狀態數據有序更新。
    (3)、在電商系統中,訂單創建、支付、退款、物流等消息需要按照順序處理,才能保證訂單狀態的正確更新。

二、如何實現消息保序?

  • 有些消息隊列其設計就是基于隊列來實現的,比如 RabbitMQ。

  • 我們知道隊列的特性就是先進先出,天然就是有序的,使用這種“基于隊列來實現的消息隊列”傳遞消息,自然就可以實現消息保序。

  • 但是為了實現高吞吐,更多的消息隊列在設計上采用的是多分區或多隊列的實現,比如 Kafka 或 RocketMQ 。這些消息隊列在處理消息時,會將消息按照一定的策略分發到多個分區上并行處理,也就無法保證消息的有序性了。

    如果我們希望在多分區的消息隊列上實現消息保序,可以將分區數量配置為 1,這樣就可以實現和單隊列消息中間件一樣的保序效果了。

  • 此外,為了保證在消費者端消息的有序性,消費者也只能單實例單線程來消費消息,才能保證全流程消息是嚴格有序的。

  • 以上就是全局消息保序的實現方法,這種方法的實現思路其實就是全局串行處理。我們知道,串行處理有一個很大的弊端,那就是消息吞吐量有限,也沒法通過水平擴展來提升消息吞吐量。在規模比較大的場景下就顯得力不從心了。

  • 我們會發現,大多數需要消息保序的場景并不需要消息“全局有序”。多數場景下,我們只需要保證有業務關系的消息之間的順序就可以了,沒有業務關系的消息之間的先后順序,其實是無所謂的。

  • 只有數據庫 BINLOG 同步這個場景,因為數據庫事務的存在,我們沒有辦法把 BINLOG 歸并到數據庫表上,也就無法判斷 BINLOG 消息的關聯性,這種情況下必須實現全局保序,才能保證數據同步的正確性。

    將保序要求從全局放寬到局部,就可以充分利用多分區消息隊列的并發能力來提升消息吞吐量了。

  • 實現的思路是這樣的,既然我們只需要保證有關聯的消息之間的順序,那么只要把關聯的消息都發送給同一個分區處理,而分區內天然就可以保證消息的處理順序,這樣就實現了消息局部保序。下面舉個例子來說明。

  • 比如,我們用一個 4 分區的主題來處理訂單消息。可以采用哈希算法將訂單消息按照訂單號的后兩位均勻地分配到 4 個分區上。

  • 也就是,將訂單尾號 00-24 的訂單發給 0 號分區,25-49 尾號的訂單分給 1 號分區,50-74 尾號的訂單發給 2 號分區,剩余的發給 3 號分區。這樣就可以保證同一個訂單的消息總是分配相同的分區,也就實現了訂單內消息保序。

  • 多數消息中間件都內置了相應的功能來幫助我們快速實現局部消息保序。

  • 以 Kafka 為例,Kafka 的 API 支持在發送消息的時候指定一個消息的 Key,并且內置了默認的哈希算法將 Key 映射到主題的分區上,保證具有相同 Key 的消息總是會被發送到同一分區,從而實現了消息局部保序。在上面例子中,可以直接使用訂單號作為消息的 Key,示例代碼如下:

    // 訂單消息
    OrderMessage orderMessage = createOrderMessage(...);
    // 訂單號,作為Key
    String orderId = orderMessage.getOrderId();

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/86776.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/86776.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/86776.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Transformer模型詳解

Transformer Transformer真是個細節滿滿的框架呢,大三讀到根本不敢看,考研復試前看了看,以為懂了其實差得還遠,兩個多月前看了,還是一知半解,如今終于經過細細分析,算是知道了Transformer的基本…

火山引擎發布豆包大模型 1.6 與視頻生成模型 Seedance 1.0 pro

6 月 11 日,在火山引擎 FORCE 原動力大會上,字節跳動旗下火山引擎正式發布豆包大模型 1.6、豆包?視頻生成模型 Seedance 1.0 pro、豆包?語音播客模型,豆包?實時語音模型也在火山引擎全量上線,豆包大模型家族已成為擁有全模態、…

PH熱榜 | 2025-06-12

1. Atlas 標語:幾秒鐘內了解定價情況 介紹:獲取即插即用的定價頁面,讓你輕松賺錢,不再辛苦操勞。 產品網站: 立即訪問 Product Hunt: View on Product Hunt 關鍵詞:Atlas, 定價快速, 插件式…

ChatGPT革命升級!o3-pro模型重磅發布:開啟AI推理新紀元

2025年6月10日,OpenAI以一場低調而震撼的發布,正式推出了新一代推理模型o3-pro,這標志著人工智能在復雜問題解決領域的重大突破。作為ChatGPT Pro和Team訂閱用戶的專屬工具,o3-pro不僅重新定義了AI的可靠性標準,更以其…

NVIDIA Isaac GR00T N1.5 適用于 LeRobot SO-101 機械臂

系列文章目錄 目錄 系列文章目錄 前言 一、簡介 二、詳細教程 2.1 數據集準備 2.1.1 創建或下載您的數據集 2.1.2 配置模態文件 2.2 模型微調 2.3 開環評估 2.4 部署 🎉 快樂編程!💻🛠? 立即開始! 前言 一…

【編譯工具】(自動化)自動化測試工具:如何讓我的開發效率提升300%并保證代碼質量?

目錄 引言:自動化測試在現代開發中的關鍵作用 一、自動化測試金字塔:構建高效的測試策略 (1)測試金字塔模型 (2)各層級代表工具 二、前端自動化測試實戰:Jest Cypress (1&…

R語言緩釋制劑QBD解決方案之一

本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》緩釋制劑包衣處方研究的R語言解決方案。 ER聚合物包衣處方優化研究 基于初步風險評估和初始可行性研究,進行帶3個中心點的24-1分式析因DOE。藥物的釋放被識別為CQA。本研究的…

行為模式-命令模式

定義: 命令模式是一個高內聚的模式,其定義為:Encapsulate a request as an object,thereby letting you parameterize clients with different requests,queue or log requests,and support undoable operations.(將一個請求封裝成…

Ubuntu 24.04 上安裝與 Docker 部署 Sentinel

Ubuntu 24.04 上安裝與 Docker 部署 Sentinel 一、Sentinel 簡介 Sentinel 是阿里巴巴開源的分布式系統流量控制組件,提供流量控制、熔斷降級和系統負載保護等功能。它通過可視化控制臺(Dashboard)實現實時監控和規則管理,是微服…

IP 地址查詢在證券交易中的應用方式

網絡安全保障與IP地址查詢 證券交易平臺存儲著海量投資者的敏感信息以及巨額資金的交易數據,是網絡攻擊的重點目標。IP 地址查詢在檢測異常登錄行為方面至關重要。例如,當一個賬戶短時間內先在國內某城市登錄,隨后又在境外 IP 地址發起交易操…

Flutter 常用組件詳解:Text、Button、Image、ListView 和 GridView

Flutter 作為 Google 推出的跨平臺 UI 框架,憑借其高效的渲染性能和豐富的組件庫,已經成為移動應用開發的熱門選擇。本文將深入探討 Flutter 中最常用的五個基礎組件:Text、Button、Image、ListView 和 GridView,幫助開發者快速掌…

docker 單機部署redis集群(一)

docker 部署redis集群 1、創建redis網卡 docker network create redis --subnet 172.38.0.0/16查看網卡信息 docker network ls docker network inspect redis2、創建redis配置 #使用腳本創建6個redis配置for port in $(seq

MySQL 索引學習筆記

1.二叉樹,紅黑樹,B 樹,B樹 二叉樹:就是每個節點最多只能有兩個子節點的樹; 紅黑樹:就是自平衡二叉搜索樹,紅黑樹通過一下五個規則構建: 1.節點只能是紅色或黑色; 2.根…

Windows安裝docker及使用

下載 https://www.docker.com/ 安裝 啟動 此時拉取鏡像會報錯 Error response from daemon: Get "https://registry-1.docker.io/v2/": net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers) 配置引擎 添加以…

多參表達式Hive UDF

支持的操作符 :跳過,即無條件篩選:等于!:不等于range:區間內,range[n,m]表示 between n and mnrange:區間外,即not between andin:集合內,in(n,m,j,k)表示 in…

GO后端開發內存管理及參考答案

什么是 Go 的逃逸分析(Escape Analysis),為什么需要它? Go 的逃逸分析是一種編譯時技術,用于確定變量的生命周期是否超出其創建的函數作用域。通過分析變量的使用方式,編譯器能夠判斷變量是否需要在堆上分…

未來智能系統演進路線:從AGI到ASI的技術藍圖

引言:智能革命的下一個十年 在AI技術突破性發展的當下,我們正站在通用人工智能(AGI)向人工超級智能(ASI)躍遷的關鍵轉折點。本文將系統解析未來3-10年的技術演進路徑,通過模塊化組件插件&#…

eNSP-Cloud(實現本地電腦與eNSP內設備之間通信)

說明: 想象一下,你正在用eNSP搭建一個虛擬的網絡世界,里面有虛擬的路由器、交換機、電腦(PC)等等。這些設備都在你的電腦里面“運行”,它們之間可以互相通信,就像一個封閉的小王國。 但是&#…

AI Agent 核心策略解析:Function Calling 與 ReAct 的設計哲學與應用實踐

引言 在人工智能助手和自主Agent快速發展的今天,如何讓AI系統不僅能夠理解復雜指令,還能有效地執行任務并適應動態環境,成為技術演進的關鍵問題。本文將深入探討兩種核心的Agent設計策略:Function Calling(函數調用&a…

window下配置ssh免密登錄服務器

window下配置ssh免密登錄服務器 本地windows遠程登錄我的ssh服務器10.10.101.xx服務器,想要每次都免密登錄這個服務器. 記錄下教程,防止后期忘記,指導我實現這個過程。 教程 二、實踐步驟:Windows 上配置 SSH 免密登錄 2.1 確…