当新消费者连接时,Kafka消费者会获得许多重播

时间:2019-01-21 09:54:00

标签: apache-kafka kafka-consumer-api spring-kafka

我正在和Kafka一起玩,试图与它保持联系。我们需要做的一件事就是运行负载平衡的服务器集-以实现冗余/高可用性/等等-然后彼此独立地重新启动。应该很简单。

我发现的东西有些奇怪。如果我正在运行一个正在处理一组消息的Kafka使用者,然后在处理消息时将第二个使用者添加到同一使用者组,则可以获得整个消息集很多次,而不是一次。

例如,这是我运行时的日志文件:https://gist.github.com/sazzer/5604d0652ff14533654c8b543942c10e

这使用2个主题-kafka-live和kafka-bulk。每个主题都有2个分区-每个消费者一个分区。然后,测试将20条消息添加到批量队列中,然后将10条消息添加到活动队列中。 (这实际上是在测试其他东西,但我只是重新使用了设置)

从日志中,您将看到每条消息总共处理了3次,而不是我期望的那样。

此代码如下:https://gist.github.com/sazzer/c67e4db9a04aac8c0d46bbc21188775d

这是使用Spring Boot和Spring Kafka,并且-除了这种情况-还是可以使用。

当新的用户出现时,我是否想阻止某些东西停止播放所有消息?还是这只是我必须处理的事情?

欢呼

1 个答案:

答案 0 :(得分:1)

尝试将ConsumerConfig.ENABLE_AUTO_COMMIT设置为false

侦听器容器将在处理完所有记录后的每个BATCH记录之后提交偏移,而不是依赖于客户端进行提交;当发生重新平衡时,它还将提交任何未决的补偿;您还可以将AckMode设置为RECORD,它将提交处理每个记录的偏移量。

您还可以手动将分区分配给实例,并且不使用组管理进行分配。