卡夫卡消费者会议超时

时间:2014-12-20 01:21:30

标签: apache-kafka kafka-consumer-api

我们有一个应用程序,消费者会读取消息,并且该线程会执行许多操作,包括在将消息生成到另一个主题之前进行数据库访问。在线程上消费和生成消息之间的时间可能需要几分钟。一旦向新主题生成消息,就会进行提交以指示我们已完成消费者队列消息的工作。因此,自动提交被禁用。

我使用的是高级消费者,而我注意到的是zookeeper和kafka会话超时,因为我们在消费者队列上做任何事情都需要很长时间,所以kafka每次线程都会重新平衡回去从消费者队列中读取更多内容,并且消费者在一段时间后阅读新消息之前需要花费很长时间。

我可以将zookeeper会话超时设置得非常高,以免造成问题,但是我必须相应地调整重新平衡参数,并且kafka不会在其他副作用中捡起新的消费者一段时间。

我有什么方法可以解决这个问题?有没有办法让卡夫卡和动物园管理员心跳,让他们两个都开心?如果我要使用一个简单的消费者,我还会遇到同样的问题吗?

2 个答案:

答案 0 :(得分:3)

听起来你的问题归结为依靠高级消费者来管理最后读取的偏移量。使用简单的使用者可以解决该问题,因为您可以控制该偏移的持久性。请注意,所有高级使用者提交都会将最后一次读取的偏移量存储在zookeeper中。没有采取其他行动,您刚刚阅读的消息仍然存在于分区中,并且可供其他消费者阅读。

使用kafka简单消费者,您可以更好地控制偏移存储的发生时间和方式。您甚至可以将该偏移量保留在除Zookeeper之外的某个位置(例如,数据库)。

坏消息是,虽然简单的消费者本身比高级消费者更简单,但是你需要做更多的工作才能使代码工作。您还必须编写代码来访问多个分区 - 这是高级别消费者为您做的很好。

答案 1 :(得分:0)

我认为问题是消费者的民意调查方法会触发消费者的心跳请求。当你增加session.timeout时。消费者的心跳不会传达给协调员。由于这种心跳跳跃,协调员标记消费者死亡。此外,消费者重新加入的速度非常缓慢,特别是在单一消费者的情况下。

我遇到了类似的问题并要解决我必须在消费者配置属性中更改以下参数

session.timeout.ms = request.timeout.ms =超过会话超时

此外,您还必须在kafka代理节点的server.properties中添加以下属性。 group.max.session.timeout.ms =

您可以看到以下链接以获取更多详细信息。 http://grokbase.com/t/kafka/users/16324waa50/session-timeout-ms-limit