MQ消息顺序性

3 分钟阅读 453 字 + 270 词
业务中可能会存在 多个消息需要顺序处理 的情况,比如生成订单和扣减库存消息,那肯定先执行生成订单的操作,再执行扣减库存操作。但我们的项目一般都是集群部署的, 一个队列就会有多个消费者 ,怎么实现一个队列中所有顺序消息只能有一个消费者消费呢?
RabbitMQ本身并不能直接保证消息的消费顺序 ,因为其是基于 AMQP 协议 的,它使用多个消费者在多个线程上并行地消费消息。但是可以采取以下方法 间接实现消息的有序消费
image-20241020144106735
解决方法
单消费者对单队列 可以给 RabbitMQ 创建多个queue , 每个消费者只消费一个queue, 生产者== 根据订单号,把订单号相同的消息放入同一个queue ==。这样同一个订单号的消息就只会被同一个消费者顺序消费。
使用多个队列和分区键 :可以将相同类型的消息发送到多个队列,并使用 分区键 routingKey (例如基于消息的某个属性)决定消息要发送到哪个队列。然后, 在消费者端,针对每个队列都使用单个消费者来保证消息的消费顺序。
消费者内部排序 :为了减少网络延迟、消费者运行速度等影响, 在消费者端,可以对接收到的消息进行排序,以确保按照特定的顺序进行处理。消费者可以在==内部维护一个消息缓冲区==,按照==某个属性或序列号对消息进行排序后再进行处理==。