如何保证消息队列,生产端和消费端的顺序一致性?

  • 先弄清楚什么是顺序消息?

    • 即生产和消费的顺序一致。

    • 消息顺序可以分为全局顺序和局部顺序

      • 全局顺序

        • topic下面全部的消息都要有顺序。所有的消息都要按照FIFO原则进行排序。
        • FIFO,先进先出
        • 性能要求不高
      • 局部顺序(用的多)

        • 保证一组消息被顺序消费即可,性能要求高
        • 例如:每个订单中:创建订单消息、退款消息、物流消息、交易成功消息都会按照先后顺序发布。
    • 使用RoketMQ举例……一个topic有多个queue

      • 顺序发布

        • 对于一个指定的topic,客户端按照一定的先后顺序发布消息
        • 业务场景
          • 订单的顺序流程是:创建、付款、物流、完成
          • 订单号相同的消息会被先后发送到同一个队列中
        • 技术实现
          • 根据MessageQueueSelector里面进行自定义策略
          • 同个业务ID放到同个queue中
          • 如果订单号取模运算再放到selector中,同一个模的值都会投递到同一条queue
          •  
      • 顺序消费

        • 对于一个指定的topic,按照一定的先后顺序接受消息,即先发送的消息一定会先被客户端接收。
        • 技术实现
          • 消费端要在保证消费同一个topic里面的用一个队列,不应该使用MessageListenerConcurrently
          • 应该使用MessageListenerOrderly,自带单线程消费消息,
          • 不能再消费端再使用多线程进行消费。
          • 消费端分配到的queue数量是固定的,集群消费会锁住当前正在消费的队列集合的消息。所以会保证消费的顺序性
      • 注意:
        • 顺序消息不支持广播模式
        • 顺序消息不支持异步发送方式。否则将无法严格保证顺序
        • 不能在消费端使用多线程消费
  •  
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值