我们应该使用max.poll.records或max.poll.interval.ms来处理需要花费较长时间在kafka消费者中处理的记录吗?

时间:2020-04-15 13:41:05

标签: apache-kafka kafka-consumer-api

我试图了解在卡夫卡使用者中处理更长时间记录的更好的选择是什么?我进行了一些测试来了解这一点,并观察到我们可以通过修改max.poll.recordsmax.poll.interval.ms来控制它。

现在我的问题是,选择哪个更好的选择?请提出建议。

2 个答案:

答案 0 :(得分:5)

max.poll.records仅定义了一次对poll()的调用中返回的最大记录数。

现在max.poll.interval.ms定义了对poll()的调用之间的延迟。

max.poll.interval.ms:两次调用之间的最大延迟 poll()在使用消费者组管理时。这放置了鞋面 限制消费者可以在空闲之前空闲的时间 获取更多记录。 如果poll()在到期之前没有被调用 此超时,则认为该使用者失败了,该组 将重新平衡以将分区重新分配给另一个成员。 对于使用非空group.instance.id且达到此值的消费者 超时,将不会立即重新分配分区。相反, 消费者将停止发送心跳,分区将被 session.timeout.ms期满后重新分配。这反映了 已关闭的静态使用者的行为。


我相信您可以同时调整两者以达到预期的行为。例如,您可以计算消息的平均处理时间。如果平均处理时间为1秒,并且您有max.poll.records=100,则应为轮询间隔留出大约100+秒的时间。

答案 1 :(得分:0)

如果您的处理速度较慢,因此希望避免重新平衡,那么调整其中一个都可以实现。但是,扩展max.poll.interval.ms以允许两次轮询之间有更长的间隔确实会产生一些副作用。

每个使用者仅使用2个线程-轮询线程和心跳线线程。

后者会让该小组知道您的应用程序仍在运行,因此可以在max.poll.interval.ms到期之前触发重新平衡,它还可以在处理以前轮询的批次时预取记录。

轮询线程在组通信方面做了其他所有事情,因此在轮询方法期间,您可以发现是否在其他地方触发了重新平衡,可以发现分区领导者是否已经死亡,因此需要刷新元数据。这意味着如果允许两次轮询之间的间隔更长,则整个组对更改的响应会较慢(例如,没有消费者在重新平衡后才开始接收消息,直到他们都收到了新的分区-如果在一个新分区之后立即发生了重新平衡)。消费者已经开始处理批处理10分钟,那么所有消费者都将闲逛至少那段时间。

因此,在预计邮件处理速度较慢的情况下,由于响应速度更快,因此您应该选择减少每批中提取的记录。