KafkaConsumer恢复分区无法继续接收未提交的消息

时间:2018-11-12 16:05:56

标签: apache-kafka kafka-consumer-api

我使用的是一个主题,一个分区,一个使用者,Kafka客户端版本为0.10。

我得到两个不同的结果:

  1. 如果首先对paused进行分区,则产生一条消息并调用resume方法。 KafkaConsumer可以成功轮询未提交的消息。

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

我已经尝试了两天,我重复了很多次这样的测试,结果总是这样。我需要一些建议,或者有人可以告诉我其Kafka的原始机制。

1 个答案:

答案 0 :(得分:2)

为了观察#2,如果重新启动应用程序,它将为您提供未提交偏移量中的所有记录,即丢失的记录;如果您的使用者再次未提交,则在应用程序注册使用者时将再次发送该记录重新启动时使用Kafka。是预期的。

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

KafkaConsumer

  

使用者的位置给出了下一条记录的偏移量   将给出。它比最大偏移量大一个   消费者已经看到了该分区。它会自动前进   消费者在轮询(long)的呼叫中收到消息的时间。