2017-07-18 207 views
0

我在讀this SO answer和許多這樣的博客。多個消費羣體消費者如何在卡夫卡的同一主題上跨越分區工作?

我所知道的:

多的消費者可以運行多個消費者在使用多個消費羣ID,並從消費羣體只有一個消費者可以從一個分區給定的時間消耗在單個分區上運行。

我的問題是從多的消費羣體同一主題消費相關多個消費者

  1. 在多種消費(不同組)的情況下,會發生什麼耗時一個主題(最終是同一個分區)?

  2. 他們是否得到相同的數據?

  3. 如何管理偏移量?每個消費者是否分開?

  4. (可能是基於意見)您或一般推薦的方式是如何處理在單個分區上運行的單獨組的兩個使用者之間的重疊數據?

編輯: 「重疊數據」:指兩個消費者在同一分區獲得相同數據進行操作單獨的消費羣。

回答

2
  1. 是的,他們得到的數據相同。卡夫卡只在主題分區的提交日誌中存儲一份數據。如果消費者不在同一組中,那麼他們可以使用來自客戶的消費者庫的獲取請求獲得相同的數據。每個組成員將獲得哪些分區的分配由每個組的主要消費者管理。詳細步驟中的整個過程記錄在這裏https://community.hortonworks.com/articles/72378/understanding-kafka-consumer-partition-assignment.html

  2. 抵消由消費者「管理」,但「存儲」在卡夫卡經紀人的特殊__consumer_offsets主題中。

  3. 爲每個(consumer group, topic, partition)元組存儲偏移量。在發佈__consumer_offsets主題的偏移量時,該組合也被用作關鍵字,以便日誌壓縮可以刪除舊的不需要的偏移量提交消息,並使同一個(consumer group, topic, partition)元組的所有偏移量都存儲在__consumer_offsets主題的相同分區中(默認爲50分區)

+0

感謝您的回覆。你能建議如何處理第四個問題嗎? –

+0

你能解釋一下「重疊數據」的含義嗎? –

+0

如果爲了提高性能,我決定在一個分區上使用來自不同用戶組的兩位消費者。那麼,如果單獨的消費者羣體的消費者獲得相同的數據如何處理這種數據冗餘,並確保每個消息在兩個消費者中只處理一次? –

1
  1. 每個消費者組從訂閱的主題獲取每條消息。
  2. 偏移量按分區存儲。例如,假設您有一個包含2個分區的主題和一個由2個消費者組成的名爲cg的消費者組。在這種情況下,Kafka爲每個消費者分配一個分區。然後,消費者從卡夫卡(例如,消費者'詢問'Kafka:「消費者組cg分區1的該主題的偏移量是多少,或者其他消費者的分區2是多少)獲取它們被分配到的分區的偏移量。在獲得正確的抵消額後,消費者會詢問一些卡夫卡經紀人以獲取該分區中的下一條消息。

我不完全確定你的意思是重疊數據,你能澄清一點還是舉個例子?

+0

如果爲了提高性能,我決定在一個分區上使用來自不同消費羣的兩位消費者。 因此,如果單獨的消費者組的消費者獲得相同的數據如何處理這種數據冗餘,並確保每個消息在兩個消費者中只處理一次? –

+0

你不會因使用不同的消費者羣體而獲得任何性能改善,因爲他們都做完全相同的工作。就像Hans Jespersen所說的,如果你需要一個高性能的解決方案,你應該使用一個分區很多的主題,並且有很多消費者(構成一個消費者組)。此外,默認情況下,Kafka至少有一次傳遞語義,這意味着即使使用單個使用者組,也可能有重複的消息。最近Kafka添加了一次交付功能,請參閱https://kafka.apache.org/documentation/#upgrade_11_exactly_once_semantics – oh54