Kafka10.1 heartbeat.interval.ms、session.timeout.ms和max.poll.interval.ms

Posted

技术标签:

【中文标题】Kafka10.1 heartbeat.interval.ms、session.timeout.ms和max.poll.interval.ms【英文标题】:Kafka10.1 heartbeat.interval.ms, session.timeout.ms and max.poll.interval.ms 【发布时间】:2017-10-14 23:13:37 【问题描述】:

我正在使用 kafka 0.10.1.1 并与以下 3 个属性混淆。

heartbeat.interval.ms
session.timeout.ms
max.poll.interval.ms

heartbeat.interval.ms - 这是在 0.10.1 中添加的,它将在轮询之间发送心跳。 session.timeout.ms - 这是在没有对 kafka 的请求时开始重新平衡,并且在每次轮询时都会重置。 ma​​x.poll.interval.ms - 这是整个民意调查。

但是,kafka 什么时候开始重新平衡?为什么我们需要这 3 个?它们的默认值是多少?

谢谢

【问题讨论】:

我们通过增加 session.timeout.ms 和减少 max.poll.records 解决了这个问题。它有效,但我们仍在寻找更好的解决方案.. 【参考方案1】:

假设我们谈论的是 Kafka 0.10.1.0 或更高版本,其中每个消费者实例使用两个线程来运行。一个是调用poll 的用户线程;另一个是心跳线程,专门处理心跳的事情。

session.timeout.ms 用于心跳线程。如果协调器在此时间间隔过去之前未能从消费者那里获得任何心跳,它会将消费者标记为失败并触发新一轮的重新平衡。

max.poll.interval.ms 用于用户线程。如果消息处理逻辑过于繁重以至于花费大于这个时间间隔,协调者明确让消费者离开组并触发新一轮的再平衡。

heartbeat.interval.ms 用于让其他健康的消费者更快地意识到重新平衡。如果协调器触发了重新平衡,其他消费者只有通过接收封装了REBALANCE_IN_PROGRESS 异常的心跳响应才能知道这一点。心跳请求发送得越快,消费者知道它需要重新加入组的速度就越快。

建议值:session.timeout.ms:比较低的值,比如10秒。max.poll.interval.ms:根据你的处理要求heartbeat.interval.ms:比较低的值,更好1/ 3 个session.timeout.ms

【讨论】:

因此,如果满足 session.timeout.ms 或 max.poll.interval.ms 将发生重新平衡。谁先遇到。但是, session.timeout.ms 只有在调用 poll 方法时才会更新。比如说,session.timeout.ms 配置为 2 秒,max.poll.interval.ms 配置为 4 毫秒。但是,假设处理需要 3 秒,因此 poll 方法将在 3 秒后调用,但 session.timeout.ms 已经达到,因此重新平衡将开始。这里的 max.poll.interval.ms 有什么用?而且,heartbeat.interval.ms 只是为了让其他消费者尽快知道。 我没有看到任何有效的场景,其中轮询间隔设置得如此之低且远小于会话超时。实际上,引入max.poll.interval.ms并将其设置为一个较大的值只是为了给消费者更多的时间来处理消息,而不是牺牲故障检测时间。 反正一旦达到session.timeout.ms,就会触发rebalance。比如说,处理需要 10 秒,而 session.timeout.ms 被配置为 8 秒。由于处理需要 10 秒,因此将在 10 秒后调用下一个轮询方法,因此将在 session.timeout.ms 为 8 秒时开始重新平衡。即使我们将 max.poll.interval.ms 设置为 60 秒,它有什么用,因为基于 session.timeout.ms 的再平衡已经开始,低于 max.poll.interval.ms。 @user1578872 这是很好的描述:cwiki.apache.org/confluence/display/KAFKA/…【参考方案2】:

session.timeout.ms 与 heartbeat.interval.ms 密切相关。

heartbeat.interval.ms 控制 KafkaConsumer poll() 方法向组协调器发送心跳的频率,而 session.timeout.ms 控制多长时间消费者可以在不发送心跳的情况下进行操作。

因此,这两个属性通常是一起修改的。 heatbeat.interval.ms 必须低于 session.timeout.ms,通常设置为超时值的三分之一。所以如果 session.timeout.ms 是 3 秒,heartbeat.interval.ms 应该是 1 秒。

ma​​x.poll.interval.ms - 使用消费者组管理时调用 poll() 之间的最大延迟。 这为消费者在获取更多记录之前可以空闲的时间量设置了上限。如果在此超时到期之前未调用 poll(),则认为消费者失败,组将重新平衡,以便将分区重新分配给另一个成员

【讨论】:

【参考方案3】:

只是让他们更清楚,心跳线程(以及在同一进程中调用Poll函数的用户线程)将每隔“heartbeat.interval.ms”时间向协调器发送心跳,协调器将标记消费者如果超过“session.timeout.ms”或“max.poll.interval.ms”,则在用户线程中为死。

【讨论】:

以上是关于Kafka10.1 heartbeat.interval.ms、session.timeout.ms和max.poll.interval.ms的主要内容,如果未能解决你的问题,请参考以下文章

storm 访问 kerberos kafka

Kafka 0.10.1版本源码 Idea编译

八、Kafka生产者调优

电脑上已经安装了arcGIS10.1 再安装ArcGis server10.1,提示机子上已经有arcgis10.1版本了,无法安装怎办

Tensorflow 1.12 是不是与 CUDA 10.1 兼容?

音频未播放 Xcode 10.1 Swift 4