還是說只能啟動幾套行程就是幾個consumer。同一個消費組的情況下,可以在一個行程中啟動多個consumer嗎?
需要開發的時候如何配置呢?
uj5u.com熱心網友回復:
當然可以,只是同一消費組下每個消費者是競爭關系,可以提升消費性能。
uj5u.com熱心網友回復:
首先,你的topic必須是多個磁區的。一個磁區,一個消費者組ID(consumerGroupId)只會有一個消費者實體去消費資料。
例如topic1有2個磁區,cgi1有3個消費者,只有2個消費者各自消費topic1的其中一個磁區,剩余1個獲取不到消費權限,沒有資料吐給他。
當其中一個消費者掛掉或者處理延遲超過配置閾值,此消費者會被broker視為掛掉,識訓消費權限,由空閑的那個代替掛掉的消費者,從掛掉消費者最后一次提交的offset開始重新消費。
關于上述機制,自行搜索【kafka isr】In-Sync Replica機制。無論是消費者還是磁區副本復制,都是遵循這個機制的。這是kafka最核心的知識點之一。
uj5u.com熱心網友回復:
所以我們最穩健的做法是 n個磁區有 n+x個消費者實體去消費,然后再通過相關業務機制,控制因為掛掉、替補造成的重復消費,降低其副作用。
uj5u.com熱心網友回復:
Quote: 參考 2 樓 LinkSe7en 的回復:
能舉例講一下,如何避免替補的這個消費者,避免重復消費嗎。是說比如在外部資料庫存盤已經消費的offset嗎,還是kafka內部能做什么配置?
uj5u.com熱心網友回復:
參考 4 樓 doublepotato 的回復: Quote: 參考 2 樓 LinkSe7en 的回復:
能舉例講一下,如何避免替補的這個消費者,避免重復消費嗎。是說比如在外部資料庫存盤已經消費的offset嗎,還是kafka內部能做什么配置?
通用做法是 1、控制每批訊息盡可能少(但不能1條1批) 2、消費超時適中 這兩者需要結合你的消費邏輯進行調優
至于外部資料庫校驗這塊 要看你業務邏輯是怎么系結了。比如消費1條就往資料庫進行寫入1條記錄,那在訊息里就要有唯一欄位進行區分。或者是變更資料庫記錄、無法通過欄位確認的,那就需要一些低成本但快速的唯一校驗方法,例如BloomFilter,去記錄offset是否被正確處理。
實際業務中 精確一次語意 保證起來成本是很高的。我們一般是基于消費的業務邏輯 選擇 最多一次(0-1) 或 至少一次 (1-n) 兩者中權衡選其一。你不做任何額外動作就是 至少一次。BloomFilter校驗 就是最多一次。
uj5u.com熱心網友回復:
參考 4 樓 doublepotato 的回復: Quote: 參考 2 樓 LinkSe7en 的回復:
能舉例講一下,如何避免替補的這個消費者,避免重復消費嗎。是說比如在外部資料庫存盤已經消費的offset嗎,還是kafka內部能做什么配置?
避免kafka重復消費的終極方案是consumer端實作冪等消費消費,減少批次訊息消費,提升吞吐量這些都是戰術手段,考慮網路是不可靠條件下這種問題是無解的,就像拜占庭將軍問題一樣
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/52620.html
標籤:分布式計算/Hadoop
上一篇:請問有人能打開看見統計seeing-theory的網站嗎
下一篇:Leetcode在線求助