簡體   English   中英

組中的Kafka消費者跳過分區

[英]Kafka consumer in group skips the partitions

我有一個消費主題的消費者。 主題有 6 個分區。 分配給該組的單個消費者。 我做如下的輪詢Consumer.poll(10000)我在沒有記錄返回時退出消費者獲取。

從文檔中,我相信當沒有要使用的記錄和持續時間 10000 足以重新平衡和獲取記錄時, poll 返回空。 大多數情況下,輪詢消耗所有分區的記錄,但有時輪詢從 3 個分區獲取記錄並返回空記錄,而不消耗其他 3 個分區。

順便說一句,我使用了 2.0.1 Kafka 客戶端,而 Kafka 服務器版本是 2.11 - 2.2.0。

任何人都知道為什么我的消費者跳過其他分區並返回空記錄。我應該怎么做才能消耗所有分區。

max.poll.records參數默認為 500。 因此,有時可能無法通過一個 poll() 獲取主題中所有分區的所有消息。

max.poll.records :在一次調用 poll() 中返回的最大記錄數。

順便說一下,組中只有一個消費者並不是使用分區主題的合適方式。 消費者組中的消費者數量應等於最佳實踐中訂閱的主題中的分區數量。 (默認情況下,Kafka 將分區平均分配給消費者)否則您無法橫向擴展負載,在這種情況下,擁有分區並沒有多大意義。

Kafka 總是為消費者分配分區。 不可能有未分配給消費者的分區。 (如果訂閱了這個話題)

但在你的情況下,因為你退出消費者需要一些時間( session.timeout.ms )認為這個消費者被卡夫卡死了。 如果session.timeout.ms通過而再次啟動consumer,那么Kafka意識到consumer group中有兩個活躍的consumer,並為這兩個consumer平均分配partition。 (例如:分區 0, 1, 2 到消費者 1 和分區 3, 4, 5 到消費者 2)但是當 Kafka 意識到其中一個消費者死亡后,在消費者組中開始重新平衡並將所有分區分配給消費者組中的一位活躍消費者。

session.timeout.ms :使用 Kafka 的組管理工具時用於檢測客戶端故障的超時。 客戶端定期發送心跳以向代理指示其活躍度。 如果在此會話超時到期之前代理沒有收到心跳,則代理將從組中刪除此客戶端並啟動重新平衡。 請注意,該值必須在由 group.min.session.timeout.ms 和 group.max.session.timeout.ms 在代理配置中配置的允許范圍內

您可以在代理端使用此 cli 命令檢查消費者組的當前分區分配:

./kafka/bin/kafka-consumer-groups.sh --bootstrap-server localhost:9092 --describe --group yourConsumerGroup

暫無
暫無

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

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