所有分类
  • 所有分类
  • 未分类

RabbitMQ保证消息顺序的方案

简介

本文介绍RabbitMQ的消息被消费时顺序错乱的场景以及解决方案。

顺序错乱的场景 

场景1:一个queue,多个consumer

一个queue,有多个consumer去消费,这样就会造成顺序的错误,consumer从MQ里面读取数据是有序的,但是每个consumer的执行时间是不固定的,无法保证先读到消息的consumer一定先完成操作,这样就会出现消息并没有按照顺序执行,造成数据顺序错误。

场景2:consumer多线程消费

一个queue对应一个consumer,但是consumer里面进行了多线程消费,这样也会造成消息消费顺序错误。

解决方案

解决方案很简单:单个consumer,单线程消费。

比如:使用单活模式队列,这样只会有一个consumer在消费。然后consumer里边,要用单线程去处理。

注意:除非业务一定要保持顺序,否则无需处理顺序性问题,毕竟处理顺序性时会导致性能下降。 ​

3

评论6

请先

  1. 一个queue,多个consumer 怎么处理呢?
    小七 2023-08-24 0
    • 这样就不好处理了。如果一定要顺序,可以用个分布式的东西,比如:redis,对某个队列加锁,消费完之后释放锁,让其他消费者可以取到锁。
      自学精灵 2023-08-24 3
      • 那这样不还是变成了单线程消费了么
        150003 2024-05-20 0
        • 想严格保证顺序,只能这么做了。但实际开发中,很少需要严格保证顺序的。
          自学精灵 2024-05-21 0
      • 单活模式队列能不能用呢?还是说有啥限制
        张网捕星光 2025-02-18 0
        • 单活模式队列可以用,属于本文说的:单个consumer,单线程消费。我把单活模式队列给加到解决方案处的示例了。
          自学精灵 2025-02-18 0
显示验证码
没有账号?注册  忘记密码?

社交账号快速登录