簡體   English   中英

Kafka消息傳遞語義

[英]Kafka message delivery semantic

我正在閱讀有關消費者的Kafka 文檔並面臨以下消息消費定義:

我們的主題分為一組完全有序的分區,每個分區在任何給定時間由每個訂閱消費者組中的一個消費者消費。 這意味着消費者在每個分區中的位置只是一個整數,即要消費的下一條消息的偏移量。

我解釋了以下措辭:

消費者組從由多個分區組成的主題中讀取數據。 然后,該組中的每個消費者都被分配了一些分區子集,這些分區與該組中其他消費者的分區不重疊。


考慮以下情況:

由 2 個消費者C1C2組成的消費者組GRP從由 2 個分區P1P2組成的主題TPC讀取數據。

問題:如果在某個時間點C1P1讀取, C2P2讀取,是否可以重新平衡,以便C1開始從P2C2P1讀取。 如果是這樣,在什么條件下會發生這種情況?

它與上面的引用並不矛盾。

我在您的問題和評論中看到了一些需要討論的內容。

  1. 您對引用段落的解釋是正確的。

  2. 問題“如果是這樣,在什么條件下會發生這種情況?”:是的,這種情況可能發生。 消費者分配給 TopicPartition 的變化主要是通過重新平衡觸發的。 在以下情況下將觸發消費者重新平衡:

消費者重新平衡在以下情況下啟動

  • 消費者離開消費者組(通過未能及時發送心跳或明確請求離開)

  • 一個新的消費者加入消費者組

  • 消費者更改其主題訂閱

  • 消費者組注意到任何訂閱主題的主題元數據發生了變化(例如分區數量的增加)

【來源:Confluent Kafka 開發者培訓資料】

請記住,在重新平衡期間,所有消費者都會暫停。

  1. 您的評論“C1 從 P1 讀取一些消息而不提交偏移量。然后它失去與 Kafka 的連接並成功處理消息。同時創建另一個消費者 C3 並將其分配給 P1 讀取相同的消息。”

我認為這種情況與消費者重新平衡無關,因為您的消費者 C1 可能會在處理數據后但在將數據提交回 Kafka 之前死亡。 現在,如果您重新啟動消費者 C1,它將再次讀取相同的消息,因為它尚未提交它們。

這稱為“至少一次”傳遞語義,並且與啟用了 auto.commit 等時的“至少一次”語義不同。 我猜您正在尋找分布式系統中的“聖杯”,即“恰好一次語義”:)

為此,您需要考慮從 Kafka 到應用程序接收器的整個應用程序。 如果您的應用程序的輸出不是冪等的,您可能無法實現一次性語義 (EOS)。 但是如果你的輸出接收器又是 Kafka,你實際上可以實現 EOS。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM