Kafka 如何保證消息消費的全局順序性

来源:https://www.cnblogs.com/edisonfish/archive/2023/11/27/17860198.html
-Advertisement-
Play Games

哈嘍大家好,我是鹹魚 今天我們繼續來講一講 Kafka 當有消息被生產出來的時候,如果沒有指定分區或者指定 key ,那麼消費會按照【輪詢】的方式均勻地分配到所有可用分區中,但不一定按照分區順序來分配 我們知道,在 Kafka 中消費者可以訂閱一個或多個主題,並被分配一個或多個分區 如果一個消費者消 ...


哈嘍大家好,我是鹹魚

今天我們繼續來講一講 Kafka

當有消息被生產出來的時候,如果沒有指定分區或者指定 key ,那麼消費會按照【輪詢】的方式均勻地分配到所有可用分區中,但不一定按照分區順序來分配


我們知道,在 Kafka 中消費者可以訂閱一個或多個主題,並被分配一個或多個分區

如果一個消費者消費了多個分區,某些場景下消費者需要順序地消費消息,但消息並不是按照順序分配給分區的,所以就不一定能夠保證消息消費的全局順序性

比如下圖中 Msg0002 消息並不是在 Msg0001 消息之後的,就有可能導致消費者先把 Msg0002 消息給消費, Msg0001 消息才被消費

那麼這種情況該怎麼解決?如何儘可能地保證消息消費的全局順序性?(即這些消息具有因果關係)要想消費消息 B 必須先消費消息 A

要註意的是,Kafka 的設計目標是提供高吞吐量和低延遲,而不是強制保證全局有序性

所以這篇文章探討的是需要強調全局順序性場景下的 Kafka 應用

單分區

最簡單粗暴的方法,雖然 Kafka 不能保證全局消費順序性,但是能夠保證分區內的消息順序性

所以我們可以只創建一個分區,並讓消費者消費這個分區,這樣就能夠保證消費的消息是有序的

但是這樣做大大降低了吞吐量和處理效率,容易使得性能出現瓶頸

基於 key

在 Kafka 中,基於 key 的消息分配策略是通過消息中的鍵(key)來確定消息發送到哪個分區

當生產者發送消息時,可以指定一個鍵(key),Kafka 使用這個鍵通過哈希演算法來確定消息被髮送到哪個分區

由於相同的 key 就發送到同一分區,這樣就能夠保證了消費的消息是有序的

然而,如果只有一個消費者消費相同 key 的消息,那麼與單分區相比,基於 key 的消息分配策略不會提高吞吐量

因為即使相同 key 的消息在多個分區中,但同一消費者依然只能從一個分區中消費,這並不會增加整體的處理能力。

但如果有多個消費者消費相同 key 的消息,基於 key 的分區策略可以提高消費者並行消費的能力


因為這些消費者可以同時從不同分區中讀取消息,從而增加整體的處理速度。這種情況下,基於 key 的消息分配可以提高整體吞吐量

最後總結一下:

  • Kafka 的設計目標是提供高吞吐量和低延遲,而不是強制保證全局有序性,所以Kafka使用多分區的概念,並且只保證單分區有序

  • 如果想要實現消息的全局有序

    • 單分區策略:

      一個主題下只創建一個分區,一個消費者只消費一個分區,但這樣做毫無併發性可言,極大降低系統性能

    • 基於 key 的消息分配策略:

      由於相同的 key 就發送到同一分區,這樣就能夠保證了消費的消息是有序的。然而,如果只有一個消費者消費相同 key 的消息,與前面單分區相比沒有什麼區別


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 位運算 題目背景 題目由 daiyulong20120222 創作(me) 並由 QBW1117完善以及數據 。 題目描述 給定兩個數\(x,y\) ,在給定一個位運算符號 \(c\)。 請你列出 \(x,y\) 進行 \(c\) 位運算是的算數豎式式。 註: 豎式這麼列: 顯示出兩個數的完整二進位 ...
  • 主要介紹了第一個Spring MVC程式的環境搭建、父子項目結構、Tomcat配置、配置文件。對DispatcherServlet的講解,2個核心類型:1.RequestMappingHandlerMapping 2.RequestMappingHandlerAdapter,視圖解析器ViewRes... ...
  • matplotlib是基於python生態開發的一個可視化繪圖庫,它的出現讓python在數據分析及機器學習方面占了重要的一部分,目前很多數據分析及機器學習相關方面的工程都有使用到這個庫,並且由於其簡單易用,安裝簡單等方面的優勢深得廣大開發者的喜愛。 ...
  • HtmlAgilityPack是一個.NET平臺下的HTML解析庫,它可以將HTML文本轉換為DOM文檔對象,方便我們對HTML文本進行操作和分析。HtmlAgilityPack支持XPath語法,可以通過XPath表達式來獲取DOM節點,同時還提供了一些方便的API,可以實現HTML文本的解析、修 ...
  • MVC 的過濾器(Filters)也翻譯為“篩選器”。但是老周更喜歡翻譯為“過濾器”,意思上更好理解。 既然都叫過濾器了,就是在MVC的操作方法調用前後進行特殊處理的類型。比如: a、此調用是否已授權? b、在模型綁定之前要不要修改數據源?(可能含有兒童不宜的數據) c、在調用MVC方法前要不要改一 ...
  • 需要有的知識點: c# 基礎以及c#高級基礎 Ado.net 基礎 SqlServer 以及MySQL (都需要高級部分) Asp.net Mvc Core 基礎 1. 新手的煩惱 (1) SQL 拼不對,錯還不會找 (2) 開發效率低 (3) 如果發現欄位需要重命名,得挨個地方去修改 (4) 老闆 ...
  • 在 .NET Core 中,日誌是一個非常重要的組件,它可以幫助我們記錄應用程式的運行情況,以便在出現問題時進行排查。在本文中,我們將介紹五個優秀的 .NET Core 日誌框架,它們分別是 Serilog、NLog、Log4Net、Microsoft.Extensions.Logging 和 Lo ...
  • 1. 平均負載 平均負載是指單位時間內,系統處於可運行狀態和不可中斷狀態的平均進程數,也就是平均活躍進程數,它和CPU使用率並沒有直接關係。 可運行狀態的進程是指正在使用CPU或者等待CPU資源的進程。當我們使用類似於"ps"命令時,這些進程通常以"R"狀態(Running或Runnable)顯示。 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...