是否可以將來自給定分區的消息分割到多個線程上?假設我有一個單獨的分區和一百個進程,每個進程都有一百個線程 - 我的單個分區的消息是否只會被賦予10000個線程中的一個?Kafka高級消費者:分區可以有多個線程使用它嗎?
回答
多個線程無法使用相同的分區,除非這些線程位於不同的使用者組中。儘管您有大量閒置消費者,但只有一個線程會佔用單個分區中的消息。
分區數是卡夫卡的並行度單位。爲了讓多個消費者使用相同的分區,您必須增加主題的分區數量,直至達到您想要達到的並行度或將每個線程放入不同的使用者組中,但我認爲後者並不可取。
如果您有多個消費者從同一個消費羣下的相同主題消費,那麼主題中的消息會分發給這些消費者。換句話說,每個消費者都會得到一個不重疊的消息子集。以下幾行取自Kafka FAQ頁面
我應該爲消費者選擇多個組ID還是單個組ID?
如果所有消費者使用相同的組ID,則主題中的消息將分發給這些消費者。換句話說,每個消費者都會得到一個不重疊的消息子集。 在同一組中有更多的消費者增加了消費的並行度和整體吞吐量程度。請參閱下一個關於消費者實例數量選擇的問題。另一方面,如果每個消費者都在自己的組中,每個消費者都將獲得所有消息的完整副本。
爲什麼一些消費羣體中的某些消費者從未收到任何消息? 目前,主題分區是我們在同一消費羣中的消費者之間分發消息的最小單元。因此,如果消費者數量大於Kafka集羣中的分區總數(跨所有經紀人),則某些消費者將永遠不會獲得任何數據。解決的辦法是增加經紀人的分區數量
沒有在極端情況下。
卡夫卡高級消費者可以確保一條消息只會被消費一次。並確保一個分區最多隻能被一個線程佔用。
因爲在卡夫卡高級消費者中有一個本地隊列。 消費者考慮您是否從本地隊列中輪詢消息,您已消費該消息。
所以讓我們講一個故事:
線程1佔用分區0
線程1輪詢消息M0。消息m1,m2 ...已經在本地隊列中。
重新平衡後,kafka將清除本地隊列並重新註冊。
線程2現在消耗分區0,但線程1仍在消耗m0。
線程2可以輪詢m1,m2 ...現在。
您可以看到兩個線程此時正在使用相同的分區。
- 1. Kafka高級消費者error_code = 15
- 2. Kafka:多個獨立消費者羣體可以消費一個主題嗎?
- 3. 多位消費者使用spring kafka
- 4. Kafka.consumer.RangeAssignor:消費者線程沒有使用代理分區logstash_logstash-indexer
- 5. 可以在消費者或生產者中使用kafka broker ip嗎?
- 6. 高效消費者線程與多個生產者
- 7. 消費者生產者多線程消費者不會消逝
- 8. 使用新消費者API刪除kafka消費者偏移量
- 9. 在Rust消費者中消費多個Kafka主題
- 10. C# - 多個生產者線程與單個消費者線程
- 11. kafka是否可以支持多少消費者?
- 12. kafka消費者尋求不工作:AssertionError:未分配的分區
- 13. 多線程生產者/消費者
- 14. 多線程生產者/消費者
- 15. python-kafka:消費者可以根據消息屬性跳過消息嗎?
- 16. 生產者 - 使用環緩衝區和線程的消費者
- 17. Apache Kafka - iOS消費者
- 18. kafka消費者上的AssertionError
- 19. Apache Kafka:消費者狀態
- 20. clj-kafka - 消費者空
- 21. 同步1個生產者和多個消費者(多線程)
- 22. 多線程:多個生產者+一個消費者
- 23. kafka消費者讀取和寫入同一分區
- 24. 多生產者/一個消費者Java多線程
- 25. 使用Java中的多線程的生產者/消費者
- 26. Apache Kafka如何將消息發送給多個消費者組?
- 27. 如何在多個消費者閱讀相同的kafka消息
- 28. Kafka transactional生產者和消費者
- 29. 反應器消費者的多線程
- 30. 基於多線程的RabbitMQ消費者