更新时间:2024-11-20 GMT+08:00
消息从生产到消费时延高达6分钟
问题现象
消息从生产到消费的端到端时延偶现到达6分钟,业务对消息时延较为敏感。
分析过程
详细分析
查看用户消费组行为日志文件,文件中存在以下三种日志:
- Preparing to rebalance group 1
- Stabilized group
- Member consumer-xxx in group 1 has failed
对文件中每次Preparing到Stabilized完成的时间进行计算得到以下结果图。图中时间为UTC+0时间,对应北京时间需要加8小时。
图1 消费组rebalance图
从以上图中可以看出,消费组rebalance的性能在7月1号06:49(即北京时间7月1号14:49)以后存在明显劣化的情况,导致客户端异常。
根因描述
用户业务中偶尔会存在某一个消费者无法及时响应rebalance的动作,导致整个消费组消费阻塞,一直到该消费者响应rebalance动作为止。
问题规避
- 建议用户根据业务区分不同消费组使用,降低单消费者阻塞导致的影响访问。
- max.poll.interval.ms用于设置消费组请求消费消息的最大时间间隔,如果消费者在超时前没有发起下一次消费请求,服务端会触发rebalance。调大max.poll.interval.ms的默认配置,降低问题频率。
问题解决措施
- 区分业务使用不同消费组。
- 需要客户侧排查自身业务,优化自身业务处理逻辑,提高处理效率,降低阻塞时间。
背景知识介绍
消费组可以简单认为有两种状态REBALANCING和STABILIZED。
- REBALANCING:消费组元数据发生变化,该状态下消费组中的所有消费者都无法进行正常的业务消费,该场景触发场景为消费组内有新的消费者加入或有已经建立连接的消费者退出。
- STABILIZED:rebalance完成,消费组处于稳定状态,该状态下消费组中的消费者可以进行正常的业务消费,触发条件是,当前消费组内的所有消费者都同步完成新的消费组元数据,包括之前已经同步过的消费者,也需要重新同步。
消费组简单流程如下:
- 有新的消费者加入或退出,服务端记录的消费组元数据更新,服务端更新消费组进入REBALANCING状态。
- 服务端等待所有消费者(包含已有的消费者)同步最新的元数据。
- 所有消费者同步完最新的元数据后,服务端更新消费组状态为STABILIZED。
- 消费者开始正常的消费业务。