2015-04-26 106 views

回答

3

多个线程无法使用相同的分区,除非这些线程位于不同的使用者组中。尽管您有大量闲置消费者,但只有一个线程会占用单个分区中的消息。

分区数是卡夫卡的并行度单位。为了让多个消费者使用相同的分区,您必须增加主题的分区数量,直至达到您想要达到的并行度或将每个线程放入不同的使用者组中,但我认为后者并不可取。

2

如果您有多个消费者从同一个消费群下的相同主题消费,那么主题中的消息会分发给这些消费者。换句话说,每个消费者都会得到一个不重叠的消息子集。以下几行取自Kafka FAQ页面

我应该为消费者选择多个组ID还是单个组ID?
如果所有消费者使用相同的组ID,则主题中的消息将分发给这些消费者。换句话说,每个消费者都会得到一个不重叠的消息子集。 在同一组中有更多的消费者增加了消费的并行度和整体吞吐量程度。请参阅下一个关于消费者实例数量选择的问题。另一方面,如果每个消费者都在自己的组中,每个消费者都将获得所有消息的完整副本。

为什么一些消费群体中的某些消费者从未收到任何消息? 目前,主题分区是我们在同一消费群中的消费者之间分发消息的最小单元。因此,如果消费者数量大于Kafka集群中的分区总数(跨所有经纪人),则某些消费者将永远不会获得任何数据。解决的办法是增加经纪人的分区数量

0

没有在极端情况下。

卡夫卡高级消费者可以确保一条消息只会被消费一次。并确保一个分区最多只能被一个线程占用。

因为在卡夫卡高级消费者中有一个本地队列。 消费者考虑您是否从本地队列中轮询消息,您已消费该消息。

所以让我们讲一个故事:

  1. 线程1占用分区0

  2. 线程1轮询消息M0。消息m1,m2 ...已经在本地队列中。

  3. 重新平衡后,kafka将清除本地队列并重新注册。

  4. 线程2现在消耗分区0,但线程1仍在消耗m0。

  5. 线程2可以轮询m1,m2 ...现在。

您可以看到两个线程此时正在使用相同的分区。

相关问题