我正在测试Kafka如何使用高级Java APIS在多个消费者上工作。
创建了1个主题,包含5个分区、1个生产者和2个消费者(C1、C2)。每个使用者将只有一个线程,并且partition.assignment.strategy设置为range。
C1启动时,它会声明所有分区。然后C2启动,ZK将触发重新平衡。之后,C1将声明(0, 1, 2),C2将声明(3, 4)。它工作得很好,直到现在。
然后我检查了C1收到的消息,我希望消息只是来自分区(0, 1, 2)。但在我的日志文件中,我可以找到来自所有分区的消息,这也发生在C2中。它就像设置为roundrobin partition.assignment.strategy一样。这就是卡夫卡发送消息的方式。或者那一定是弄错了?
发布于 2015-09-16 21:31:55
首先,为了纠正您的方法,对于一个主题,拥有与分区相同的使用者数量总是更好的。通过这种方式,每个消费者将只声明一个分区,并且只坚持该分区,您将准确地从该分区获得数据,并且以有序的方式,而不是从其他分区。
现在来回答您的问题,为什么您要从两个消费者中的几乎所有分区获取数据,因为与分区相比,您有更少的消费者,在本例中,每个消费者线程都将尝试访问分区。
还有一种理论认为,如果与每个主题的分区数量相比,消费者的数量更多,那么一些消费者可能永远不会获得任何数据。
https://stackoverflow.com/questions/32603126
复制相似问题