4.9. 最小化重新平衡的影响
Kafka 消费者组中的重新平衡可能会引入延迟并降低吞吐量,从而影响整体服务性能。在组中活跃消费者间重新平衡分区是进行以下所需的时间:
- 消费者提交其偏移
- 要形成的新消费者组
- 为组成员分配分区的组领导者
- 组中的消费者,接收其分配并开始获取
重新平衡由消费者健康、网络问题、配置更新和扩展事件的变化触发。这个过程可能会增加服务停机时间,特别是当它经常发生,比如在组中用户滚动重启过程中。
要最小化重新平衡的影响,请考虑以下策略和配置:
- 评估吞吐量和并行性
根据消费者的数量,评估输入主题的预期吞吐量(每秒和记录)和并行(分区数)。
如果需要调整,请首先设置静态成员资格,采用分区分配策略,并根据使用
max.poll.records属性返回的记录设置限制。如果需要,为超时和间隔添加其他配置,因为它们可能会引入与故障处理相关的问题。- 使用静态成员资格
-
为每个消费者实例分配唯一标识符(
group.instance.id)。静态成员资格引入了持久性,因此静态用户在重启后保留分区分配,从而减少不必要的重新平衡。 - 采用分区分配策略
- 使用适当的分区分配策略来减少在重新平衡过程中需要重新分配的分区数量,从而尽量减少对活跃用户的影响。
-
org.apache.kafka.clients.consumer.CooperativeStickyAssignor策略特别有用,因为它可确保在重新平衡过程中最小分区移动和更好的稳定性。
- 调整记录限制和轮询间隔
-
使用
max.poll.records属性来限制每个轮询期间返回的记录数量。更有效地处理较少的消息可防止延迟。 -
通过把调用设置为
poll ()方法之间的最大间隔,使用max.poll.interval.ms属性来防止长期处理任务导致重新平衡。 - 或者,请考虑暂停分区,以一次检索较少的记录。
-
使用
- 调整会话超时和心跳间隔
-
使用
session.timeout.ms属性设置较长的超时时间,以减少由临时网络 glitches 或 minor 处理延迟导致的重新平衡。 -
调整
heartbeat.interval.ms属性,以平衡故障检测检查,同时尽量减少不必要的重新平衡。
-
使用
- 监控消费者健康状况
- 在消费者应用程序中不稳定(如频繁崩溃)可能会触发重新平衡。使用 Kafka 使用者指标来监控重新平衡率、会话省略和失败的获取请求等内容。
尽可能减少重新平衡影响的示例
扩展策略
要最小化扩展消费者组期间重新平衡的影响,请考虑以下方法:
- 设置重新平衡延迟
-
在 Kafka 配置中使用
group.initial.rebalance.delay.ms属性,在执行重新平衡前延迟用户加入新的消费者组所需的时间。引入延迟有助于避免在启动同一时间接近的多个用户时触发多个重新平衡。适当的延迟取决于所使用的编配,在某些情况下可能不适用。 - 避免频繁扩展
- 仅在需要时和以受控递增方式保持用户稳定、扩展的数量。
根据需要监控系统性能并调整您的扩展策略。
- 每个分区的滞后应该是恒定且低的。
- 用户每秒处理的记录应与输入主题中的每秒记录匹配。
- 使用 Kafka Exporter 检查消费者滞后,并确定是否需要扩展。
- 实施动态扩展策略
- 如果使用动态或事件驱动的工具来扩展消费者应用程序,请根据消息的积压设置滞后阈值。
- 为消费者组定义最大和最小副本数。
- 在扩展事件之间设置句点,以防止快速扩展。
注意
如果长时间消息处理不可避免,请考虑暂停和恢复分区。如果您暂停所有分区,则 poll () 不会返回任何记录,允许您继续调用它,而不会给消费者造成混乱。另外,您可以将处理任务卸载到 worker 线程池。这有助于防止延迟和潜在的重新平衡。