RocketMQ 如何实现顺序消息

如何实现顺序消息

默认无法保证顺序消息

需要程序保证发送和消费的是同一个 Queue(多线程消费也无法保证)

生产者: 发送端保证发往一个固定的 queue ,生产者可以在消息体设置消息的顺序。

  1. 可以选择 实现 MessageQueueSelector 选择一个 Queue 进行发送

  2. 也可以选择 RocketMQ 的默认实现

    • SelectMessageQueueByHash:按参数的 HashCode 与可选队列进行求余选择
    producer.send(msg,new SelectMessageQueueByHash(),arg);
    
    • SeleclMessageQueueRandom:随机选择,不满足要求

MQ: Queue 本身就是顺序追加写,只需保证一个队列同一时间只有一个 consumer 消费

  • 通过加锁实现。为防止 consumer 宕机导致 Queue 被死锁,为其设置延时锁,consumer 上的顺序消费有一个定时任务,每隔一定时间向 broker 发送请求以延长锁定时间

消费者:

  • Pull 模式:消费者自己去拉取消息,由于 queue 本身就是顺序写的,拉取到的消息也是顺序的,消费者需要保证顺序的消费
  • Push 模式:消费者实例实现 MQPushConsumer 接口,提供注册监听的方法消费消息。使用 registerMessageListener() 重载方法
    • MessageListenerOrderly:串行消费,consumer 会把消息放入本地队列并加锁,定时任务保证锁的同步。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值