【问题标题】:Kafka Consumers get many replays when new consumers connect当新消费者连接时,Kafka 消费者会获得很多重播
【发布时间】:2023-03-03 11:12:02
【问题描述】:

我在玩 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,并且 - 除了这个案例 - 它刚刚工作。

当新的消费者出现时,我是否遗漏了一些东西来阻止它重播所有消息?或者这只是我必须处理的事情?

干杯

【问题讨论】:

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


    【解决方案1】:

    尝试将ConsumerConfig.ENABLE_AUTO_COMMIT 设置为false

    侦听器容器不依赖客户端进行提交,而是在每批记录全部处理完毕后提交偏移量;当发生再平衡时,它还将提交任何未决的偏移量;您还可以将AckMode 设置为RECORD,它将提交处理的每条记录的偏移量。

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

    【讨论】:

      猜你喜欢
      • 2017-11-16
      • 1970-01-01
      • 2020-04-02
      • 2019-03-14
      • 1970-01-01
      • 2017-06-19
      • 2017-09-09
      • 2015-02-18
      • 1970-01-01
      相关资源
      最近更新 更多