使用消息隊列遇到的問題—kafka

目錄

  • 1 分區
  • 2 消費者
  • 3 Kafka 如何保證消息的消費順序?
    • 3.1 方案一
    • 3.2 方案二
  • 4 消息積壓

在項目中使用kafka作為消息隊列,核心工作是創建生產者—包裝數據;創建消費者----包裝數據。
欠缺一些思考,特此梳理項目中使用kafka遇到的一些問題和解決方案

1 分區

參考博文:點擊鏈接

分區:主題可以被分為若干個分區(partition),同一個主題中的分區可以不在一個機器上,有可能會部署在多個機器上,由此來實現 kafka 的伸縮性,單一主題中的分區有序,但是無法保證主題中所有的分區有序

示例:假設有一個主題(Topic)A,有三個分區(Partition 0、Partition 1、Partition 2)。如果生產者產生了5條消息,該如何分配?

這就涉及到了kafka的分區機制了

kafka 的分區策略指的就是將生產者發送到哪個分區的算法。Kafka 為我們提供了默認的分區策略,同時它也支持你自定義分區策略。

分區策略有

  • 順序輪詢 (下面示例介紹)
  • 隨機輪詢

在這里插入圖片描述

Kafka中消息的分配到分區的過程是由分區器(Partitioner)來負責的。默認情況下,Kafka使用的是輪詢分區策略,也就是說,生產者產生的消息會依次被分配到不同的分區,以此循環。

假設有一個主題(Topic)A,有三個分區(Partition 0、Partition 1、Partition 2)。如果生產者產生了5條消息,這些消息會被輪詢地分配到這三個分區中,直到所有消息都被發送。分配的過程如下:

第1條消息分配到 Partition 0
第2條消息分配到 Partition 1
第3條消息分配到 Partition 2
第4條消息再次分配到 Partition 0
第5條消息再次分配到 Partition 1

這樣的分配方式保證了各個分區的負載均衡。總體而言,如果有足夠的消息量,這些消息會在各個分區之間均勻分布,從而實現了平均分配的效果。

需要注意的是,分區策略是可以配置的,你可以自定義分區器來實現不同的分配策略,但默認情況下,輪詢分區是常見的方式。

在這里插入圖片描述

2 消費者

消費組: 消費數據的時候,都必須指定一個group id,指定一個組的id假定程序A和程序B指定的group id號一樣,那么兩個程序就屬于同一個消費組。
特殊: 比如,有一個主題topicA程序A去消費了這個topicA,那么程序B就不能再去消費topicA(程序A和程序B屬于一個消費組);再比如程序A已經消費了topicA里面的數據,現在還是重新再次消費topicA的數據,是不可以的,但是重新指定一個group id號以后,可以消費。不同消費組之間沒有影響,消費組需自定義,消費者名稱程序自動生成(獨一無二)。

此時有兩個消費者,三個分區,該如何分配呢?
在這里插入圖片描述

在 Kafka 中,一個消費者組(Consumer Group)可以由多個消費者組成。當消費者組訂閱一個主題(Topic)時,Kafka 會自動將主題的分區分配給消費者組中的消費者。

對于一個消費者組中的多個消費者,它們不需要手動指定分區。Kafka 使用一種分區分配策略來確保每個分區只被一個消費者消費。默認情況下,Kafka 使用的是范圍分配(Range Assignment)策略。

在范圍分配策略下,每個消費者被分配一定范圍的分區。例如,有一個主題有三個分區(Partition 0、Partition 1、Partition 2),消費者組中有兩個消費者(Consumer A 和 Consumer B),分配可能如下:

Consumer A 被分配 Partition 0 和 Partition 1
Consumer B 被分配 Partition 2
這種自動的分區分配機制使得消費者組能夠 并行 地處理消息,提高整體的消費吞吐量。

需要注意的是,如果消費者組中的消費者數量發生變化,分區的分配會動態調整以適應新的消費者數量,而無需手動干預。 Kafka會在有新的消費者加入或者有消費者退出時自動重新平衡分區。這種自動的分區調整機制是 Kafka 提供的一項強大的功能,能夠使得整個系統更加靈活和容錯。

3 Kafka 如何保證消息的消費順序?

消費后會提交偏移量
在這里插入圖片描述

示例:生產者提供了5條消息,暫且按照上述方式分配消息。當消費者組 消費的時候會出現這種情況

0:01時刻 :張三消費c(并提交offset) 李四消費b(并提交offset)
重新動態匹配 消費者和分區,這里暫且忽略
0:02時刻 :張三消費a(并提交offset) 李四消費e(并提交offset)

此時消費的順序是 c,b---->a,e
期待的消費順序是a–>b—>c—>d---->e

因此是亂序的,需要重新設計方案解決

3.1 方案一

若是只有一個分區,這樣就可以保證消費順序了:a–>b—>c—>d---->e

在這里插入圖片描述

3.2 方案二

指定消息全存在某一個分區

如何指定: Kafka 中發送 1 條消息的時候,可以指定 topic, partition, key,data(數據) 4 個參數。如果你發送消息的時候指定了 Partition 的話,所有消息都會被發送到指定的 Partition。并且,同一個 key 的消息可以保證只發送到同一個 partition,這個我們可以采用表/對象的 id 來作為 key 。

  • Topic: 指定消息要發送到的主題。
  • Partition: 指定消息要發送到的分區。如果指定了分區,那么所有的消息都會被發送到這個分區。
  • Key: 通常用于確定消息應該被發送到哪個分區。如果你使用相同的 key,Kafka 會根據 key 使用分區器(Partitioner)將具有相同 key 的- 消息發送到同一個分區。
  • Value: 實際的消息內容。

Key是用于計算消息應該被分配到哪個分區的依據,而Partition是直接指定分區

4 消息積壓

4.1 方案一

場景描述:

  • Kafka 主題:orders,2個分區
  • 初始狀態:有一個消費者組(Consumer Group)中有一個消費者實例(Consumer Instance)用于處理訂單消息。
  • 積壓情況:由于訂單數量激增,導致 orders 主題中的消息積壓。
  1. 增加消費者

以前消息被分發到2個分區,但是只有一個消費者消費其中一個分區,另外一個暫時擱置,多創建一個消費者,提高使用率。
這里有個細節,項目執行后,唯一的線程:main線程---->消費分區1,無法做到同時控制另外一個消費者去消費分區2。看似消費者多了,實際效率沒變化。只能增加線程

  1. 增加線程

一個消費者占一個線程,這樣項目啟動,2個線程控制2個消費者,kafka負載均衡自動分配(一個消費者消費一個分區),提高了效率

  1. 異步消費 (并不能處理消息積壓)

在系統中,主線程調用 某個方法后,這個方法先返回數據給主,主繼續執行自己的邏輯。而這個方法是異步的,所以他可以在后臺創建線程和消費者,不會造成系統阻塞。

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

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

相關文章

淺析以太網接口及串口轉以太網技術

淺析以太網接口 以太網相關接口主要包括:MII/RMII/SMII以及GMII/RGMII/SGMII接口。 一、MII接口 MII(Media Independent Interface)介質無關接口或稱為媒體獨立接口,它是IEEE-802.3定義的以太網行業標準。它包括一個數據接口和…

卷積詳解和并行卷積

ps:在 TensorFlow Keras 中,構建 Sequential 模型的正確方式是將層作為列表傳遞,而不是作為一系列單獨的參數。 modelmodels.Sequential([layers,layers]) 而不是modelmodels.Sequential(layers,layers) 文章目錄 卷積…

Redis 基礎—Redis Desktop Manager(Redis可視化工具)安裝及使用教程

Redis Desktop Manager 是一個可視化的 Redis 數據庫管理工具,可以方便地查看和操作 Redis 數據庫。使用 Redis Desktop Manager 可以大大提高 Redis 數據庫的管理效率。 RDM的安裝和配置 首先,您需要下載和安裝Redis Desktop Manager。 安裝完成后&am…

Python 小紅書評論區采集 小紅薯xhs精準用戶獲客

成品圖 評論接口https://edith.xiaohongshu.com/api/sns/web/v2/comment/page?note_id筆記id&cursor光標 初次使用cursor為空,該接口為GET,需要x-s,x-t簽名驗證 子評論接口https://edith.xiaohongshu.com/api/sns/web/v2/comment/sub/page?note_id%s&r…

python爬取robomaster論壇文章數據,攜帶登錄信息

一. 內容簡介 python爬取robomaster論壇文章數據。 二. 軟件環境 2.1vsCode 2.2Anaconda version: conda 22.9.0 2.3代碼 三.主要流程 3.1 接口分析,以及網頁結構分析 # 這是文章鏈接,其實id就是文章的id # https://bbs.robomaster.com/forum.php?modview…

win系統一臺電腦安裝兩個不同版本的mysql教程

文章目錄 1.mysql下載zip包(地址)2.解壓在你的電腦上(不要再C盤和帶中文的路徑)3.創建my.ini文件4.更改環境變量(方便使用, 可選)5.打包mysql服務6.初始化mysql的data7.啟動剛剛打包的服務8.更改密碼 1.mys…

CentOS常用基礎命令大全(linux命令)2

CentOS常用基礎命令大全(linux命令) 1.關機 (系統的關機、重啟以及登出 ) 的命令 shutdown -h now 關閉系統(1) init 0 關閉系統(2) telinit 0 關閉系統(3) shutdown -h hours:minutes & 按預定時間關閉系統 shutdown -c 取消按預定時間關閉系統 sh…

【無標將列表中的多組參數依次帶入指定的函數將每次調用函數返回結果組成列表itertools.starmap()題】

【小白從小學Python、C、Java】 【計算機等考500強證書考研】 【Python-數據分析】 將列表中的多組參數 依次帶入指定的函數 將每次調用函數 返回結果組成列表 itertools.starmap() [太陽]選擇題 請問以下代碼輸出的結果是? import itertools a [(1, 2), (3, 4)] p…

基于JAVA+SpringBoot+Vue的前后端分離的醫院信息智能化HIS系統

?全網粉絲20W,csdn特邀作者、博客專家、CSDN新星計劃導師、java領域優質創作者,博客之星、掘金/華為云/阿里云/InfoQ等平臺優質作者、專注于Java技術領域和畢業項目實戰? 🍅文末獲取項目下載方式🍅 一、項目背景介紹: 隨著科技的不斷發展&a…

解決Ubuntu16.04沒聲音

第一步:安裝 PulseAudio Volum Control Ubuntu沒有聲音(聽不到聲音)的解決方法 第二步:No cards available for configuration 【解決Ubuntu18.04沒聲音:No cards available for configuration】 完美解決&#xf…

【WPF.NET開發】WPF中的對話框

目錄 1、消息框 2、通用對話框 3、自定義對話框 實現對話框 4、打開對話框的 UI 元素 4.1 菜單項 4.2 按鈕 5、返回結果 5.1 模式對話框 5.2 處理響應 5.3 非模式對話框 Windows Presentation Foundation (WPF) 為你提供了自行設計對話框的方法。 對話框是窗口&…

浙政釘SDK安裝

專有訂單SDK&#xff08;jar包&#xff09;下載 專有釘釘門戶 (dg-work.cn) Maven依賴 浙政釘 <!-- 浙政釘 --> <dependency><groupId>com.oracel</groupId><artifactId>zwdd-sdk-java</artifactId><version>1.2.0</version…

概率密度函數(PDF)正態分布

概率密度函數&#xff08;PDF&#xff09;是一個描述連續隨機變量取特定值的相對可能性的函數。對于正態分布的情況&#xff0c;其PDF有一個特定的形式&#xff0c;這個形式中包括了一個常數乘以一個指數函數&#xff0c;它假設誤差項服從均值為0的正態分布&#xff1a; p ( …

外匯天眼:新西蘭監管機構永久性停止對David McEwen及與其相關的實體的命令

新西蘭金融市場管理局&#xff08;FMA&#xff09;已對David Elgar McEwen及與其相關的實體&#xff08;McEwen and Associates&#xff09;發布了永久性停止令。 與McEwen先生相關的實體包括Stockfox Limited、Cosmopolitan Holdings Limited、Strategy Services Limited、Fun…

Ubuntu系統使用快速入門實踐(七)——軟件安裝與使用(3)

Ubuntu系統使用快速入門實踐系列文章 下面是Ubuntu系統使用系列文章的總鏈接&#xff0c;本人發表這個系列的文章鏈接均收錄于此 Ubuntu系統使用快速入門實踐系列文章總鏈接 下面是專欄地址&#xff1a; Ubuntu系統使用快速入門實踐系列文章專欄 文章目錄 Ubuntu系統使用快速…

在uniapp中,可以使用那些預定義的樣式類

u-flex&#xff1a;設置元素為彈性布局。u-flex-v&#xff1a;設置元素為縱向彈性布局。u-flex-h&#xff1a;設置元素為橫向彈性布局。u-p-10&#xff1a;設置元素的上下左右邊距為10rpx。u-p-t-10&#xff1a;設置元素的上邊距為10rpx。u-p-b-10&#xff1a;設置元素的下邊距…

教育心得整理

壓抑使人反抗&#xff0c;反抗就是報復&#xff0c;報復就會引起犯罪。要消滅犯罪&#xff0c;我們必須杜絕引起孩子報復心理的行為&#xff0c;更重要的是&#xff0c;我們一定要對孩子表現出來愛與尊重 限制批評的次數限制每次批評的范圍限制每次批評的強度 當彼此的信任和…

第一百九十五回 連接藍牙設備的細節

文章目錄 1. 概念介紹2. 實現方法2.1 示例代碼2.2 知識回顧2.3 實現方法3. 示例代碼我們在上一章回中介紹了"分享三個使用TextField的細節"沉浸式狀態樣相關的內容,本章回中將介紹SliverList組件.閑話休提,讓我們一起Talk Flutter吧。 1. 概念介紹 我們在本章回中…

機器學習之無監督學習:九大聚類算法

今天&#xff0c;和大家分享一下機器學習之無監督學習中的常見的聚類方法。 今天&#xff0c;和大家分享一下機器學習之無監督學習中的常見的聚類方法。 在無監督學習中&#xff0c;我們的數據并不帶有任何標簽&#xff0c;因此在無監督學習中要做的就是將這一系列無標簽的數…

Spring Cloud Gateway中對admin端點進行認證

前言 我們被掃了一個漏洞&#xff0c;SpringBoot Actuator 未授權訪問&#xff0c;漏洞描述是這樣的&#xff1a; Actuator 是 springboot 提供的用來對應用系統進行自省和監控的功能模塊&#xff0c;借助于 Actuator 開發者可以很方便地對應用系統某些監控指標進行查看、統計…