[英]Kafka message delivery semantic
我正在閱讀有關消費者的Kafka 文檔並面臨以下消息消費定義:
我們的主題分為一組完全有序的分區,每個分區在任何給定時間由每個訂閱消費者組中的一個消費者消費。 這意味着消費者在每個分區中的位置只是一個整數,即要消費的下一條消息的偏移量。
我解釋了以下措辭:
消費者組從由多個分區組成的主題中讀取數據。 然后,該組中的每個消費者都被分配了一些分區子集,這些分區與該組中其他消費者的分區不重疊。
考慮以下情況:
由 2 個消費者C1
和C2
組成的消費者組GRP
從由 2 個分區P1
和P2
組成的主題TPC
讀取數據。
問題:如果在某個時間點C1
從P1
讀取, C2
從P2
讀取,是否可以重新平衡,以便C1
開始從P2
和C2
從P1
讀取。 如果是這樣,在什么條件下會發生這種情況?
它與上面的引用並不矛盾。
我在您的問題和評論中看到了一些需要討論的內容。
您對引用段落的解釋是正確的。
問題“如果是這樣,在什么條件下會發生這種情況?”:是的,這種情況可能發生。 消費者分配給 TopicPartition 的變化主要是通過重新平衡觸發的。 在以下情況下將觸發消費者重新平衡:
消費者重新平衡在以下情況下啟動
消費者離開消費者組(通過未能及時發送心跳或明確請求離開)
一個新的消費者加入消費者組
消費者更改其主題訂閱
消費者組注意到任何訂閱主題的主題元數據發生了變化(例如分區數量的增加)
【來源:Confluent Kafka 開發者培訓資料】
請記住,在重新平衡期間,所有消費者都會暫停。
我認為這種情況與消費者重新平衡無關,因為您的消費者 C1 可能會在處理數據后但在將數據提交回 Kafka 之前死亡。 現在,如果您重新啟動消費者 C1,它將再次讀取相同的消息,因為它尚未提交它們。
這稱為“至少一次”傳遞語義,並且與啟用了 auto.commit 等時的“至少一次”語義不同。 我猜您正在尋找分布式系統中的“聖杯”,即“恰好一次語義”:)
為此,您需要考慮從 Kafka 到應用程序接收器的整個應用程序。 如果您的應用程序的輸出不是冪等的,您可能無法實現一次性語義 (EOS)。 但是如果你的輸出接收器又是 Kafka,你實際上可以實現 EOS。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.