本文为您介绍云消息队列 RocketMQ 版的消息流控机制。
背景信息
消息流控
云消息队列 RocketMQ 版的流控机制主要为您解答如下问题:
系统在什么情况下会触发流控?
触发流控时客户端行为是什么?
应该如何避免触发流控,以及如何应对突发流控?
消息流控机制
消息流控基本概念
消息流控指的是系统容量或水位过高,云消息队列 RocketMQ 版服务端会通过快速失败返回流控错误或通过请求超时来避免底层资源承受过高压力。
触发条件
云消息队列 RocketMQ 版的消息流控触发条件如下:
存储压力大:消费者分组的初始消费位点为当前队列的最大消费位点。若某些场景(例如业务上新等)需要回溯到指定时刻前开始消费,此时队列的存储压力会瞬间飙升,触发消息流控。
服务端请求任务排队溢出:若消费者消费能力不足,导致队列中有大量堆积消息,当堆积消息超过一定数量后会触发消息流控,减少下游消费系统压力。
流控行为
当系统触发消息发送流控时,客户端会收到系统限流错误和异常,错误码信息如下:
TCP协议
reply-code:215
reply-text关键词:message flow control
商业版TCP协议Java SDK 1.9.0.Final以下版本限流时表现为请求超时,超时时长与客户端设置的超时时长保持一致;商业版TCP协议Java SDK 1.9.0.Final及以上版本,客户端收到系统流控错误码后,会根据指数退避策略进行消息重试。
HTTP协议
reply-code:429
reply-text关键词:TooManyRequests
当请求量超过设定的限流阈值时,系统将启动反压机制。此时,超出阈值的请求会在服务端被暂时挂起约10毫秒后返回,避免系统因过载而影响整体性能和稳定性。
处理建议
如何避免触发消息流控:触发限流的根本原因是业务峰值流量与实例规格不匹配,您可以利用可观测性功能监控系统水位容量等,评估业务峰值流量,购买合理的实例规格,避免触发流控机制。
突发消息流控处理:如果因为突发原因触发消息流控,且客户端内置的重试流程执行失败,则建议业务方将请求调用临时替换到其他系统进行应急处理。