是否可以将来自给定分区的消息分割到多个线程上?假设我有一个单独的分区和一百个进程,每个进程都有一百个线程 - 我的单个分区的消息是否只会被赋予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消费者