我们要求组成一个消费者群组的群集中所有节点的给定Kafka分区的消息应始终执行单个消息且不重叠。它们可以容忍(略微)无序处理,但不能容忍时间重叠。
我们如何在重新平衡期间保持安全 - 例如假设我们自动调整我们的消费者,并为同一个消费者群体启动新的消费者 - 那么新的消费者将不得不从现有消费者手中接管分区消费者群体。
对于特定分区P,我们假设消费者c1之前正在处理分区P,现在它必须放弃由于重新平衡而另一个消费者c2接管相同的分区P.
我的问题是 - 如何保证上述要求。因此,如果消费者c2开始处理分区P的消息与消费者c1同时处理同一分区P的消息,那就不好了。< / p>
我可以想象一些违反这种情况的情况 - 例如消费者停止对Zookeeper的心跳 - 这会触发重新平衡,但消费者并没有真正死亡 - 并继续处理 - 所以让我们排除这种情况 - 我们将不得不忍受它 - 虽然不太可能。
答案 0 :(得分:1)
我认为这种用例在当今非常普遍。这可以通过在订阅特定主题的同时传递ConsumerRebalanceListener
接口的自定义实现来实现
KafkaConsumer#subscribe(集合主题,ConsumerRebalanceListener回调)
ConsumerRebalanceListener.onPartitionsRevoked(Collection<TopicPartition> partitions)
在重新平衡操作开始之前和使用者停止获取数据之后被调用。建议在此回调中提交偏移量,以防止重复数据。
在分区重新分配完成之后并且使用者开始获取数据之前,将调用ConsumerRebalanceListener.onPartitionsAssigned(Collection<TopicPartition> partitions)
方法。您可以在此处加载分配分区的状态/偏移量。