给出以下设置:
服务器包含两个使用者,每个主题对应一个:
在这种情况下,当我们检查组主题-1组的kafka-consumer-groups.bat的输出时,我们会看到以下内容:
这似乎和我们预期的一样。由于分区计数为2,因此我们只有两个活动使用者。第三个消费者只是空闲。我们可以很好地使用主题中的消息。
接下来,我们关闭服务器B(主动分配给分区的服务器B)。这样做,我们希望topic-1-group进入重新平衡,并期望consumer-A1取代consumer-B1并被分配到一个分区,以便以下情况成立:
然而,我们所看到的是消费者群体主题-1群体进入了似乎并未停止的再平衡状态。由于该组正在重新平衡,心跳似乎也失败了。
从中恢复的唯一方法是关闭另一台服务器,以便主题-1组只有一个消费者。当只有一个消费者时,我们能够成功接收该主题的消息。接下来,如果我们启动其他两个服务器,我们将继续成功接收该主题的消息。
问题
答案 0 :(得分:0)
(我会发布一个答案,因为我并不乐意发表评论。这可能是答案'虽然是一个令人不满意的答案:比分区更多的消费者不是支持的配置)。
根据kafka文件: https://kafka.apache.org/documentation.html#introduction 通过在主题中具有并行性概念 - 分区 - ,Kafka能够在消费者流程池中提供订购保证和负载平衡。这是通过将主题中的分区分配给使用者组中的使用者来实现的,以便每个分区仅由该组中的一个使用者使用。通过这样做,我们确保使用者是该分区的唯一读者并按顺序使用数据。由于有许多分区,这仍然可以平衡许多消费者实例的负载。但请注意,消费者组中的消费者实例不能超过分区。
在实践中,额外的消费者在活跃的消费者消失之前一直处于闲置状态,似乎有时处于永久性重新平衡的状态。
此stackoverflow线程(In Apache Kafka why can't there be more consumer instances than partitions?)讨论了这个问题,并讨论了为什么您希望消费者少于分区,但没有说明当您拥有更多消息时会发生什么。其中一个有趣的注释提供了一个原因,您可能需要配置更多(用于故障转移),但没有回复: 现在我们还想确保即使某些消费者实例失败,我们每个消费者实例仍然有一个分区。这样做的逻辑方法是为群组增加更多消费者;虽然一切都很好,但他们不会做任何事情,但是当一些消费者失败时,其中一个会收到该分区。为什么不允许这样做?
答案 1 :(得分:0)
按照Apache kafka合流标准-如果您向一个组添加的使用者数量大于分区数量,那么某些使用者保持空闲状态,因此理想情况下您不应该这样做