【发布时间】:2015-07-04 18:23:51
【问题描述】:
来自给定分区的消息可以在多个线程上划分吗?假设我有一个分区和一百个进程,每个进程都有一百个线程 - 来自我的单个分区的消息是否会只提供给这 10000 个线程中的一个?
【问题讨论】:
标签: multithreading apache-kafka kafka-consumer-api
来自给定分区的消息可以在多个线程上划分吗?假设我有一个分区和一百个进程,每个进程都有一百个线程 - 来自我的单个分区的消息是否会只提供给这 10000 个线程中的一个?
【问题讨论】:
标签: multithreading apache-kafka kafka-consumer-api
与其使用线程,不如增加消费者和分区以获得更好的吞吐量和更好的控制
【讨论】:
在极端情况下不会。
Kafka 高级消费者可以保证一条消息只消费一次。并且保证一个分区最多只能被一个线程消费。
因为,kafka 高级消费者中有一个本地队列。 消费者认为,如果您从本地队列中轮询了一条消息,那么您已经消费了该消息。
让我们讲一个故事:
线程 1 消耗分区 0。
线程 1 轮询消息 m0。消息 m1,m2... 已在本地队列中。
重新平衡,kafka会清除本地队列并重新注册。
线程 2 现在消耗分区 0,但线程 1 仍在消耗 m0。
线程 2 现在可以轮询 m1,m2...。
您可以看到此时两个线程正在使用同一个分区。
【讨论】:
如果您有多个消费者从同一消费者组下的同一主题消费,则主题中的消息将分布在这些消费者之间。换句话说,每个消费者都会得到消息的一个不重叠的子集。以下几行取自Kafka FAQ页面
我应该为消费者选择多个组 id 还是一个?
如果所有消费者使用相同的组 id,则主题中的消息将在这些消费者之间分发。换句话说,每个消费者都会得到一个不重叠的消息子集。 在同一组中拥有更多的消费者会增加并行度和消费的整体吞吐量。有关消费者实例数量的选择,请参阅下一个问题。另一方面,如果每个消费者都在自己的组中,则每个消费者将获得所有消息的完整副本。
为什么消费者组中的一些消费者从未收到任何消息? 目前,主题分区是我们在同一消费者组中的消费者之间分发消息的最小单位。因此,如果消费者数量大于 Kafka 集群中的分区总数(跨所有代理),则某些消费者将永远无法获得任何数据。解决办法是增加broker上的partition数量
【讨论】:
多个线程不能使用同一个分区,除非这些线程在不同的消费者组中。尽管您有很多空闲的消费者,但只有一个线程会消费来自单个分区的消息。
分区数是Kafka中的并行单位。为了让多个消费者消费同一个分区,你必须将主题的分区数量增加到你想要实现的并行度,或者将每个线程放入单独的消费者组,但我认为后者是不可取的。
【讨论】: