kafka多個消費者消費一個topic_kafka:一文讀懂消費者背后的那點quot;貓膩quot;

e6bb83bdb856dfb15c7343a6508bfe39.png

來自:z小趙

前言

經過前幾篇文章的介紹,大致了解了生產者背后的運行原理。消息有生產就得有人去消費,今天我們就來介紹下消費端消費消息背后發生的那點事兒。

文章概覽

  1. 消費者與消費組的“父子關系”。
  2. Repartition 觸發時機。
  3. 消費者與 ZK 的關系。
  4. 消費端工作流程。
  5. 消費者的三種消費情況。

消費者與消費組的“父子關系”

eb15abb7d30db788c762149ea0be7b2c.png
消費者消費組關系圖

Kafka 消費端確保一個 Partition 在一個消費者組內只能被一個消費者消費。這句話改怎么理解呢?

  1. 在同一個消費者組內,一個 Partition 只能被一個消費者消費。
  2. 在同一個消費者組內,所有消費者組合起來必定可以消費一個 Topic 下的所有 Partition。
  3. 在同一個消費組內,一個消費者可以消費多個 Partition 的信息。
  4. 在不同消費者組內,同一個分區可以被多個消費者消費。
  5. 每個消費者組一定會完整消費一個 Topic 下的所有 Partition。

消費組存在的意義

了解了消費者與消費組的關系后,有朋友會比較疑惑消費者組有啥實際存在的意義呢?或者說消費組的作用是什么?

作者對消費組的作用歸結了如下兩點。

  1. 在實際生產中,對于同一個 Topic,可能有 A、B、C 等 N 個消費方想要消費。比如一份用戶點擊日志,A 消費方想用來做一個用戶近 N 天點擊過哪些商品;B 消費方想用來做一個用戶近 N 天點擊過前 TopN 個相似的商品;C 消費方想用來做一個根據用戶點擊過的商品推薦相關周邊的商品需求。對于多應用場景,就可以使用消費組來隔離不同的業務使用場景,從而達到一個 Topic 可以被多個消費組重復消費的目的。
  2. 消費組與 Partition 的消費進度綁定。當有新的消費者加入或者有消費者從消費組退出時,會觸發消費組的 Repartition 操作(后面會詳細介紹 Repartition);在 Repartition 前,Partition1 被消費組的消費者 A 進行消費,Repartition 后,Partition1 消費組的消費者 B 進行消費,為了避免消息被重復消費,需要從消費組記錄的 Partition 消費進度讀取當前消費到的位置(即 OffSet 位置),然后在繼續消費,從而達到消費者的平滑遷移,同時也提高了系統的可用性。

Repartition 觸發時機

使用過 Kafka 消費者客戶端的同學肯定知道,消費者組內偶爾會觸發 Repartition 操作,所謂 Repartition 即 Partition 在某些情況下重新被分配給參與消費的消費者。基本可以分為如下幾種情況。

  1. 消費組內某消費者宕機,觸發 Repartition 操作,如下圖所示。
7e276f83216b8f5ff824ba4dbdedbb4b.png
消費者宕機情況
  1. 消費組內新增消費者,觸發 Repartition 操作,如下圖所示。一般這種情況是為了提高消費端的消費能力,從而加快消費進度。
f098b5a7f4c191c195d3c6742628d8a7.png
新增消費者情況
  1. Topic 下的 Partition 增多,觸發 Repartition 操作,如下圖所示。一般這種調整 Partition 個數的情況也是為了提高消費端消費速度的,因為當消費者個數大于等于 Partition 個數時,在增加消費者個數是沒有用的(原因是:在一個消費組內,消費者:Partition = 1:N,當 N 小于 1 時,相當于消費者過剩了),所以一方面增加 Partition 個數同時增加消費者個數可以提高消費端的消費速度。
0cbe0dfe599a2eaa75806d9fc4633839.png
新增Partition個數情況

消費者與 ZK 的關系

眾所周知,ZK 不僅保存了消費者消費 partition 的進度,同時也保存了消費組的成員列表、partition 的所有者。消費者想要消費 Partition,需要從 ZK 中獲取該消費者對應的分區信息及當前分區對應的消費進度,即 OffSert 信息。那么 Partition 應該由那個消費者進行消費,決定因素有哪些呢?從之前的圖中不難得出,兩個重要因素分別是:消費組中存活的消費者列表和 Topic 對應的 Partition 列表。通過這兩個因素結合 Partition 分配算法,即可得出消費者與 Partition 的對應關系,然后將信息存儲到 ZK 中。Kafka 有高級 API 和低級 API,如果不需要操作 OffSet 偏移量的提交,可通過高級 API 直接使用,從而降低使用者的難度。對于一些比較特殊的使用場景,比如想要消費特定 Partition 的信息,Kafka 也提供了低級 API 可進行手動操作。

消費端工作流程

在介紹消費端工作流程前,先來熟悉一下用到的一些組件。

  • KakfaConsumer:消費端,用于啟動消費者進程來消費消息。
  • ConsumerConfig:消費端配置管理,用于給消費端配置相關參數,比如指定 Kafka 集群,設置自動提交和自動提交時間間隔等等參數,都由其來管理。
  • ConsumerConnector:消費者連接器,通過消費者連接器可以獲得 Kafka 消息流,然后通過消息流就能獲得消息從而使得客戶端開始消費消息。

以上三者之間的關系可以概括為:消費端使用消費者配置管理創建出了消費者連接器,通過消費者連接器創建隊列(這個隊列的作用也是為了緩存數據),其中隊列中的消息由專門的拉取線程從服務端拉取然后寫入,最后由消費者客戶端輪詢隊列中的消息進行消費。具體操作流程如下圖所示。

f2bd398d592f61897843b5aecc5311cb.png
消費端工作流程

我們在從消費者與 ZK 的角度來看看其工作流程是什么樣的?

35323cb72a2f13e85527a18ff7d4602f.png
消費端與ZK之間的工作流程

從上圖可以看出,首先拉取線程每拉取一次消息,同步更新一次拉取狀態,其作用是為了下一次拉取消息時能夠拉取到最新產生的消息;拉取線程將拉取到的消息寫入到隊列中等待消費消費線程去真正讀取處理。消費線程以輪詢的方式持續讀取隊列中的消息,只要發現隊列中有消息就開始消費,消費完消息后更新消費進度,此處需要注意的是,消費線程不是每次都和 ZK 同步消費進度,而是將消費進度暫時寫入本地。這樣做的目的是為了減少消費者與 ZK 的頻繁同步消息,從而降低 ZK 的壓力。

消費者的三種消費情況

消費者從服務端的 Partition 上拉取到消息,消費消息有三種情況,分別如下:

  1. 至少一次。即一條消息至少被消費一次,消息不可能丟失,但是可能會被重復消費。
  2. 至多一次。即一條消息最多可以被消費一次,消息不可能被重復消費,但是消息有可能丟失。
  3. 正好一次。即一條消息正好被消費一次,消息不可能丟失也不可能被重復消費。

1.至少一次

消費者讀取消息,先處理消息,在保存消費進度。消費者拉取到消息,先消費消息,然后在保存偏移量,當消費者消費消息后還沒來得及保存偏移量,則會造成消息被重復消費。如下圖所示:

8a6bae60cbf43f71e66d2e7c3cc1cd8b.png
先消費后保存消費進度

2.至多一次

消費者讀取消息,先保存消費進度,在處理消息。消費者拉取到消息,先保存了偏移量,當保存了偏移量后還沒消費完消息,消費者掛了,則會造成未消費的消息丟失。如下圖所示:

17f811c8bd5c75940ad7cfeaf377bcbd.png
先保存消費進度后消費消息

3.正好一次

正好消費一次的辦法可以通過將消費者的消費進度和消息處理結果保存在一起。只要能保證兩個操作是一個原子操作,就能達到正好消費一次的目的。通常可以將兩個操作保存在一起,比如 HDFS 中。正好消費一次流程如下圖所示。

a270507d7311a0a2649b45babcef3d78.png
正好消費一次

總結

本文講解了消費組與消費者之間的關系,及 Repartition 的觸發時機,然后講述了消費端的基本工作流程,最后提出了一條消息被重復消費的幾種情況。下篇文章我們來講講消息在服務端是怎么存儲的,敬請期待。

特別推薦一個分享架構+算法的優質內容,還沒關注的小伙伴,可以長按關注一下:

0cd743d81199a657f8f092dc80a2ba8a.png

長按訂閱更多精彩▼

9ff77bba8b8910ebadbe9ecc17635129.png

如有收獲,點個在看,誠摯感謝

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

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

相關文章

MySQL 入門教程:初學者一學就會,零基礎 MySQL 安裝及增刪改查入門

文章目錄前言一、MySQL 的相關概念介紹二、Windows 下 MySQL 的配置2.1、MySQL 安裝配置步驟2.2、MySQL 服務的啟動、停止與卸載三、MySQL 腳本的基本組成四、MySQL 中的數據類型4.1、數字類型4.2、日期和時間4.3、字符串類型五、使用 MySQL 數據庫5.1、登錄到 MySQL5.2、創建一…

四大基本反應類型的關系_如何進入四大的咨詢部門?

在會計行業,人人夢寐以求的職位,莫過于四大的財務咨詢的崗位,第一咨詢工作很高大上,第二沒有其他職位那么幸苦,我從我的工作經歷來講講,我是怎么進入咨詢這個“真香”崗位的。首先,給大家說一個…

MySQL 異常:這一篇就夠了,MySQL 拋出異常的幾種常見解決方式小結

Could not open JDBC Connection for transaction; nested exception is java.sql.SQLException: Connections could not be acquired from the underlying database! 幾種解決方式小結 文章目錄Could not open JDBC Connection for transaction; nested exception is java.sql…

vnc用戶名 查看linux_vnc用戶名未被識別,5步教你如何解決vnc用戶名未被識別

在進行vnc使用時,很多小伙伴會出現用戶名未被識別的情況,那如何解決vnc用戶名未被識別呢?咱接著往下看。使用工具:IIS7服務器管理工具主程序界面圖:官網地址:IIS7服務器管理工具作為IIS7服務器管理工具&…

IntelliJ IDEA 亂碼:全網最全 4 種方法完美解決 IntelliJ IDEA 控制臺中文亂碼問題

文章目錄前言一、修改當前 Web 項目 Tomcat Server 的虛擬機輸出選項二、修改 IntelliJ IDEA 全局編碼、項目編碼、屬性文件編碼三、IntelliJ IDEA 中自定義虛擬機選項四、直接修改 IntelliJ IDEA 配置文件的編碼信息五、修改成功亂碼問題解決總結前言 IntelliJ IDEA 如果不進行…

JVM 調優 1:“精通 JVM 調優,有過 JVM 調優經驗”簡歷敢寫嗎?薪資漲 5k 的技巧

文章目錄前言一、部分大廠對于 JVM GC 的面試題1.1、百度1.2、順豐1.3、京東1.4、淘寶1.5、阿里、蘑菇街二、Garbage Collectors(GC)作何使用三、GC 的十種類型四、JVM 的版本參數信息4.1、查看 Java 啟動時所有默認的命令行參數4.2、查看 Java 啟動時 G…

ip地址合不合法怎么看_電子印章合不合法?兩部門再發意見認定

近日,最高法、國家發改委聯合發布 《關于為新時代加快完善社會主義市場經濟體制提供司法服務和保障的意見》以助力經濟高質量發展、建設高標準市場體系為出發點和落腳點,從市場主體、產權保護、公平交易、市場秩序、民生保障、服務開放、高效解紛等七個方…

JVM 調優 2:GC 如何判斷對象是否為垃圾,三色標記算法應用原理及存在的問題?

文章目錄前言一、如何判斷一個對象是否為垃圾?1.1、reference count(引用計數)1.2、reference count(引用計數)存在的問題二、Root Searching(根可達算法或根搜索算法)2.1、Root Searching 釋義…

班尼機器人怎么拆_博鼎建筑科技外墻錯臺打磨機器人和外墻螺桿洞封堵機器人—自升造樓平臺1+N執行器...

繼上期的混凝土整平機和智能噴淋養護系統,本期給大家介紹的是實際應用在自升造樓平臺外墻環軌車上的外墻錯臺打磨機器人和外墻螺桿洞封堵機器人。外墻錯臺打磨機器人傳統外墻錯臺處理,需要人工拿鑿具對外墻面錯臺進行鑿平處理。鑿具重、操作人工容易疲勞…

架構師基礎必備:“腹有詩書氣自華”,馳騁一線大廠不是夢,抓緊收藏

文章目錄前言一、軟件1.1、何為軟件?1.2、計算機軟件的分類1.2.1、系統軟件1.2.2、應用軟件1.3、軟件系統體系結構1.3.1、C/S 結構(桌面應用程序)1.3.2、B/S 結構(Web 應用程序)1.3.3、Web 服務器與數據庫服務器1.3.4、…

JDK 7-JDK 21:Oracle Java SE 支持路線圖/Oracle Java SE Support Roadmap 持續更新

文章目錄前言一、Oracle Java SE 產品版本二、Java SE 8 的公共更新結束三、參考文檔總結前言 幾十年來,Java 生態系統已經成功地經歷了這個過程,經歷了十次主要的平臺修訂。長期強大的向后兼容性保護了整個生態系統的投資。同時,隨著時間的推…

multisim中輕觸開關在哪_現貨供應輕觸開關|品質確保|廠家直銷

輕觸開關是現今社會生活當中不可或缺的電子元器件之一,那么大家在使用的過程當中是否注意到一些細節問題。首先,我們要注意產品的放置要盡量避免接觸腐蝕性氣體以及過于潮濕的環境,這樣很容易造成產品的損壞,減少輕觸開關的使用壽…

DDoS 攻擊與防護(一):如何識別 DDoS 攻擊?DDoS 防護 ADS 服務有哪些?

文章目錄前言一、什么是 DDoS 防護 ADS?1.1、什么是 DDoS 攻擊?1.2、如何識別 DDoS 攻擊?1.3、從 Web 訪問流程分析 DDoS 攻擊1.4、DDoS 攻擊類型二、DDoS 防護 ADS 介紹2.1、Anti-DDoS 流量清洗2.2、DDoS 原生高級防護2.3、DDoS 高防三、DDo…

收藏功能_六款多功能榻榻米,裝完你家會大一半!超實用,收藏

原標題:六款多功能榻榻米,裝完你家會大一半!超實用,收藏當今社會城市的生活壓力大,在外日夜打拼,回到家中只想做一個慵懶派,隨性舒適的榻榻米,功能樣式豐富,能讓你徹底釋…

混凝土墻開洞_新樂專業混凝土切割報價適中

新樂專業混凝土切割報價適中粘碳纖維加固,屋頂加層。本公司采用目前的鋼筋混凝土切割結構分離和水鉆排孔技術。真正實現對不同規格和形狀的橋梁、道路、煙囪、建筑立柱、鋼筋砼墻體、磚混結構墻體、建筑大梁等建筑物、構筑物實施無損切割(傳統的建筑改造或局部拆除分…

class觸發后讓另一個class加樣式_Bootstrap的按鈕組樣式

將一系列的.btn包裹在.btn-group內&#xff0c;并使用我們提供的插件&#xff0c;可以實現選擇按鈕、選取塊狀區的行為功能。<div class"row mt-5 d-block"><div class"btn-group"><button class"btn btn-primary">Left</b…

碼云怎么創建公開的倉庫_使用碼云或GitHub搭建簡單的個人網站(補充hexo搭建博客)...

使用碼云或GitHub搭建個人網站碼云&#xff1a;1、新建一個倉庫路徑名會影響你的個人網站的網址(自行修改)&#xff0c;開源(公開)&#xff0c;其他默認我們點擊創建2、進入倉庫后&#xff0c;我們新建一個文件3、文件名為index.html&#xff0c;再寫入我們的html代碼然后“提交…

bsp模型適用于圖計算_【論文解讀】目標檢測之RFBnet模型

原創聲明&#xff1a;本文為 SIGAI 原創文章&#xff0c;僅供個人學習使用&#xff0c;未經允許&#xff0c;不能用于商業目的。其它機器學習、深度學習算法的全面系統講解可以閱讀《機器學習-原理、算法與應用》&#xff0c;清華大學出版社&#xff0c;雷明著&#xff0c;由SI…

win10雷電3接口驅動_“雷電3”接口知識大科普

近年來部分高端筆記本電腦在接口上會采用一種叫“雷電3”的新接口。今天小編就為大家解讀一下“雷電3”接口的特性。最早的雷電接口雷電接口是由Intel開發定制的、接口類型為mini DP&#xff0c;在雷電3接口出來之前&#xff0c;雷電1和雷電2都是作為在蘋果MAC上使用的&#xf…

springboot怎么返回404_深度分析:SpringBoot異常捕獲與封裝處理,看完你學會了嗎?...

簡介日常開發過程中&#xff0c;難免有的程序會因為某些原因拋出異常&#xff0c;而這些異常一般都是利用try &#xff0c;catch的方式處理異常或者throw&#xff0c;throws的方式拋出異常不管。這種方法對于程序員來說處理也比較麻煩&#xff0c;對客戶來說也不太友好&#xf…