我正在测试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
中。就像partition.assignment.strategy
设置为roundrobin
一样。这是Kafka如何发送消息。或者那一定是个错误?
答案 0 :(得分:0)
首先,只是为了纠正您的方法,与主题相比,拥有相同数量的消费者总是更好。通过这种方式,每个消费者只会声明一个分区,并且只会坚持使用该分区,您将从该分区获得准确的数据,并且也可以按顺序获取,而不是来自其他分区。
现在回答您的问题为什么要从消费者中的几乎所有分区获取数据,因为与分区相比,消费者的消费者较少,因此每个消费者线程都会尝试访问分区。
还有一种理论认为,如果与每个主题的分区数相比,消费者的数量更多,则有可能某些消费者永远不会获取任何数据。