PULL 消费模式:
RocketMQ4.x及之前的版本的消费负载均衡策略是以队列的维度来进行,所有行为全部是由客户端主动来完成,主要分为三步:
每个consumer定时去获取消费的topic的队列总数,以及consumer总数
将队列按编号、consumer按ip排序,用统一的分配算法计算该consumer分配哪些消费队列
每个consumer去根据算法分配出来的队列,拉取消息消费
按照这个分配方式,如果有一个队列有异常(应用自身异常,或某个broker在升级)导致消费较慢或者停止,该队列会出现堆积现象,因为队列不会被分配给其他机器,因此如果长时间不处理,队列的堆积会越来越严重。但是在某个队列消费异常的情况下,可以快速的由其它消费者接手进行消费,缓解堆积状态
。这需要保证两点:
- 高可用:单一队列的消费能力不受某个消费客户端异常的影响
- 高性能:POP订阅对消息消费的延迟和吞吐的影响在10%以内
POP消费模式
POP消费将一个主题的队列间平衡从客户端移动到服务器端
。客户端在没有指定队列的情况下向broker发出拉取请求,broker从队列内部获取消息并返回,这确保了一个队列将被多个客户端使用。整个行为就像一个弹出队列的过程。
它将添加一个新的请求命令来查询broker中的队列分配,并为pull请求添加pop功能支持标志,使broker使用pop模式。
是否考虑了前后兼容性?
客户端和代理之间添加了新的RequestCode,因此存在两种兼容性情况:
- 旧客户端+新代理:旧客户端不会用pop功能支持标志发出请求,所以代理不会启用pop模式,这一切都保持原样。
- 新客户端+旧代理:新客户端将检测代理是否支持查询队列分配的新请求命令,如果不支持,它将回退到使用旧的拉模式。