【问题标题】:KafkaConsumer resume partition cannot continue to receive uncommitted messagesKafkaConsumer 恢复分区无法继续接收未提交的消息
【发布时间】:2019-04-15 09:30:41
【问题描述】:

我用的是一个topic,一个partition,一个consumer,Kafka客户端版本是0.10。

我得到了两个不同的结果:

  1. 如果我先将paused分区,然后产生一条消息并调用resume方法。 KafkaConsumer 可以成功轮询未提交的消息。

  2. 但是如果我先产生消息并且没有提交它的偏移量,然后暂停分区,几秒钟后调用恢复方法。 KafkaConsumer 不会收到未提交的消息。我使用kafka-consumer-groups.sh在Kafka服务器上检查了它,它显示LOG-END-OFFSET minus CURRENT-OFFSET = LAG = 1

这两天我一直在想办法,我重复了很多次这样的测试,结果总是这样。我需要一些建议,或者有人可以告诉我它的 Kafka 的原始机制。

【问题讨论】:

  • 0.10 现在已经很老了,您尝试过更新的版本吗?

标签: apache-kafka kafka-consumer-api


【解决方案1】:

对于您的观察#2,如果您重新启动应用程序,它将为您提供未提交偏移量的所有记录,即丢失的记录,如果您的消费者再次未提交,它将在应用程序注册消费者时再次发送重新启动时使用 Kafka。意料之中。

假设您使用consumer.poll() 创建一个混合流接口,即如果为提到的duration 积累进入Kafka 的数据,并在持续时间结束后将其提供给消费者进行处理。这种持续的积累发生在后端,与你是否提交了偏移无关。

KafkaConsumer

消费者的位置给出了下一条记录的偏移量 将发出。它将比最高偏移量大一 消费者已经在那个分区中看到了。它会自动推进每个 消费者在调用 poll(long) 时接收消息的时间。

【讨论】:

  • 谢谢,解释清楚了。那是我的大盲点。看来我可以使用KafkaConsumer的seek方法处理#2。
猜你喜欢
  • 1970-01-01
  • 2023-04-09
  • 2018-06-22
  • 2018-01-24
  • 2017-04-22
  • 1970-01-01
  • 2014-01-23
  • 2013-05-24
  • 1970-01-01
相关资源
最近更新 更多