顺序消费
本文主要介绍云消息队列 RabbitMQ 版的顺序消费实现原理,与开源RabbitMQ的不同之处,以及其配置方式和使用限制。
顺序消费实现原理
RabbitMQ的顺序消费需要“顺序存储”和“单一消费者”两个条件同时满足才能实现。
开源 RabbitMQ 实现
单一消费者:开源支持Single Active Consumer模式或Exclusive Consumer模式两种使用方式,开源社区更推荐Single Active Consumer模式。
顺序存储:开源RabbitMQ的同一个Queue上的消息读写只会集中在一个节点,所以天然支持存储顺序性。
云消息队列 RabbitMQ 版实现
单一消费者:云消息队列 RabbitMQ 版支持开源社区推荐的Single Active Consumer模式。
顺序存储:云消息队列 RabbitMQ 版采用存算分离的分布式架构,同一Queue 的消息分布在多个节点的多个分区中。但计算节点会从存储节点读取这些分区的消息,进行归并排序后再返回给消费者,从而实现与开源版本一样的顺序消费语义。
存算分离、分布式架构下的顺序消费实现原理
如上图所示,Single Active Consumer模式的队列只有一个连接是活跃(Active)的,其它连接都是非活跃的(Inactive)。负责活跃连接的计算节点拉取所有存储节点上的消息,将消息排序后再投递给消费者。
由于消息在计算节点中被排序,因此计算节点会临时持有一部分消息。当活跃消费者在多个计算节点间漂移时,这部分缓存消息将会在稍后重新进入消费队列。
云消息队列 RabbitMQ 版优势
高并发与扩展:云消息队列 RabbitMQ 版在高并发写入性能上维持多分区的优势,同时具备卓越的横向扩展能力。
高可用性机制:云消息队列 RabbitMQ 版支持多个消费者与多个计算节点的连接,实现高可用性。当任一消费者或计算节点发生故障时,系统能够快速切换至其他节点提供服务。
启用方式
要启用顺序消费,必须将队列配置为Single Active Consumer模式。在创建队列时,将参数x-single-active-consumer
设置为true 。
启用该模式后,服务器会对队列中的消息进行排序后再投递给消费者,这可能导致消费速率降低。因此,请根据具体业务需求谨慎评估是否开启此功能。