我有一个问题,我的提交失败,因为poll()太长了(为什么会发生这种情况我不知道,没有消息,它只是在空队列中读取/提交,我的民意调查 - 间隔设置为小时)。然后,当它再次点击read()时,由于某种原因它不会重新平衡。但是,这只发生在我的代码在bluemix上运行时,本地重现异常时,下一个read()导致重新平衡。
从CommitFailedException恢复的正确方法是什么?我应该关闭()并重新创建我的消费者吗?或者调用read()应该重新平衡并让我继续?
答案 0 :(得分:1)
@kyl所以我相信使用默认的kafka-java客户端,消费者会每隔3秒检测一次,会话超时为10秒,因此您的消费者 应该保留在组中而不会被取出重新平衡发生。您CommitFailedException
中包含的消息是什么?我假设提交失败了,因为你被踢了。
其他一些问题:
你有多个消费者来了吗?去,和/或你是否有意想使用消费群体而不仅仅是一个消费者?
“我的轮询间隔设置为小时”是什么意思?
“提交空队列”是什么意思?
您能否共享消费者循环代码片段,因为这可能有助于更好地解释您正在做的事情
答案 1 :(得分:1)
commitSync
方法将自动无限期重试,因此如果您获得CommitFailedException
,那么它不是一个可重复的条件,再次调用commit不太可能有所帮助。您将获得此异常,因为您的消费者已被踢出消费者群体。
如果您使用commitAsync
提交偏移量,则自动重试不,您可能会收到RetriableCommitFailedException
以指示可能出现的暂时性错误,您可以手动重试再次提交。这听起来不是你的情况,但我把它包含在这个答案的完整性中。
一旦您的消费者被踢出小组并且您获得此CommitFailedException
异常,您可以继续调用poll()直到重新平衡完成并且您被允许回到消费者组(可能使用新的集合)分区比以前好了)它会继续。
如果您的应用程序不能容忍您接收的分区(以及密钥)在中间流中发生更改的情况,那么您应该实现一个重新平衡侦听器,该侦听器将在更改分区分配时调用。见http://kafka.apache.org/0110/javadoc/index.html?org/apache/kafka/clients/consumer/ConsumerRebalanceListener.html
如果您只是试图解决每24小时抵消过期的事实,那么除了定期调用poll()以留在消费者中之外,您还需要每天至少调用一次提交以使偏移保持最新组