我想告诉Kafka我的消费者成功处理了一条记录,所以我通过将enable.auto.commit
设置为false来关闭自动提交。我在偏移零和一个订阅的主题上有两条消息,并创建了一个消费者,以便每次调用poll
最多返回一个记录(通过设置{{1} 1)。
我现在打电话给max.poll.records
并收到第一条消息,但我不承认;我不会致电consumer.poll(5000)
或commitSync
。如果我现在再次使用相同的消费者呼叫commitAsync
,我希望得到我刚才读到的完全相同的消息,而是接收到第二条消息。
在明确承认之前,我如何让consumer.poll(5000)
继续发出相同的信息?
答案 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
之后的上一个偏移量,以便它不断返回相同的记录。
希望这有帮助!