Kafka enable.auto.commit设置为false但轮询仍然取消" next"消息

时间:2017-04-05 09:59:27

标签: apache-kafka message-hub

我想告诉Kafka我的消费者成功处理了一条记录,所以我通过将enable.auto.commit设置为false来关闭自动提交。我在偏移零和一个订阅的主题上有两条消息,并创建了一个消费者,以便每次调用poll最多返回一个记录(通过设置{{1} 1)。

我现在打电话给max.poll.records并收到第一条消息,但我不承认;我不会致电consumer.poll(5000)commitSync。如果我现在再次使用相同的消费者呼叫commitAsync,我希望得到我刚才读到的完全相同的消息,而是接收到第二条消息。

在明确承认之前,我如何让consumer.poll(5000)继续发出相同的信息?

1 个答案:

答案 0 :(得分:2)

您所描述的是预期的行为。每次拨打poll()时,都会返回下一条消息。您提交的偏移量仅在连接新消费者时使用,因此它知道从哪里开始(重新)。

在MessageHub中,我们将session.timeout设置为30秒。因此,您需要稍微调用poll()以避免断开连接。如果你的处理时间比这长,那么我可以考虑两个选项:

  • 使用Kafka 0.10.2并设置max.poll.interval.ms告诉您的Kafka客户端在处理上一条记录时保持会话处于活动状态(无需调用poll())。 (此功能在0.10.1中添加,但我们不支持该版本.0.10.2有效,因为它能够与0.10.0代理一起工作)

  • 使用seek()移回poll之后的上一个偏移量,以便它不断返回相同的记录。

希望这有帮助!