查看Rebalance详情

当消费客户端出现Rebalance时,您可以查看Rebalance的详情,包括Rebalance的时间、耗时、次数、原因以及是否有新成员加入。

背景信息

Rebalance是云消息队列 Kafka 版对分区和Consumer Group之间的消费对应关系进行重分配的过程。消费客户端出现Rebalance可能是以下原因:

  • 当消费者主动新增订阅或者取消订阅时,会触发该Consumer Group内的Rebalance。

  • 当Topic的分区数量发生变化时,会触发Rebalance。

  • 当Consumer Group内的消费者成员数量增加或者减少时,会触发Rebalance。

    • 消费出现卡顿,导致消费者心跳超时,触发Rebalance来筛选不健康的消费者。

    • 消费时间过慢,超过一定时间(max.poll.interval.ms设置的值,默认5分钟)未进行Pull拉取消息,则会导致客户端主动离开队列,触发Rebalance。

    • 消费者数量过多,为避免当前Topic-Partition的任务浪费,需要关闭一定数量的消费者,触发Rebalance。

    • 消费者数量不足,当前Topic-Partition的任务出现延迟,需要增加一定数量的消费者,触发Rebalance。

操作步骤

  1. 登录云消息队列 Kafka 版控制台,在左侧导航栏,单击实例列表

  2. 在顶部菜单栏,选择地域,然后在实例列表页面单击目标实例名称。

  3. 在左侧导航栏,单击Group 管理,然后单击目标Group名称。

  4. Group详情页面,单击Rebalance 详情页签。

为什么客户端频繁出现Rebalance?

可能原因

可能导致故障的原因包括:

  • v0.10.2之前版本的客户端:Consumer没有独立线程维持心跳,而是把心跳维持与poll接口耦合在一起。其结果就是,如果用户消费出现卡顿,就会导致Consumer心跳超时,引发Rebalance。

  • v0.10.2及之后版本的客户端:如果消费时间过慢,超过一定时间(max.poll.interval.ms设置的值,默认5分钟)未进行poll拉取消息,则会导致客户端主动离开队列,而引发Rebalance。

解决方案

首先您需要了解以下几点信息:

  • session.timeout.ms:心跳超时时间(可以由客户端自行设置)。

  • max.poll.records:每次poll返回的最大消息数量。

  • v0.10.2之前版本的客户端:心跳是通过poll接口来实现的,没有内置的独立线程。

  • v0.10.2及之后版本的客户端:为了防止客户端长时间不进行消费,Kafka客户端在v0.10.2及之后的版本中引入了max.poll.interval.ms配置参数。

  1. 参考以下说明调整参数值:

    • session.timeout.ms:v0.10.2之前的版本可适当提高该参数值,需要大于消费一批数据的时间,但不要超过30s,建议设置为25s;而v0.10.2及其之后的版本,保持默认值10s即可。

    • max.poll.records:降低该参数值,建议远远小于<单个线程每秒消费的条数> * <消费线程的个数> *<max.poll.interval.ms>的积。

    • max.poll.interval.ms:该值要大于<max.poll.records> / (<单个线程每秒消费的条数> * <消费线程的个数>)的值。

  2. 尽量提高客户端的消费速度,消费逻辑另起线程进行处理。

  3. 减少Group订阅Topic的数量,一个Group订阅的Topic最好不要超过5个,建议一个Group只订阅一个Topic。

  4. 将客户端升级至0.10.2以上版本。