如何实现顺序消息
默认无法保证顺序消息
需要程序保证发送和消费的是同一个 Queue(多线程消费也无法保证)
生产者: 发送端保证发往一个固定的 queue ,生产者可以在消息体设置消息的顺序。
-
可以选择 实现 MessageQueueSelector 选择一个 Queue 进行发送
-
也可以选择 RocketMQ 的默认实现
- SelectMessageQueueByHash:按参数的 HashCode 与可选队列进行求余选择
producer.send(msg,new SelectMessageQueueByHash(),arg);
- SeleclMessageQueueRandom:随机选择,不满足要求
MQ: Queue 本身就是顺序追加写,只需保证一个队列同一时间只有一个 consumer 消费
- 通过加锁实现。为防止 consumer 宕机导致 Queue 被死锁,为其设置延时锁,consumer 上的顺序消费有一个定时任务,每隔一定时间向 broker 发送请求以延长锁定时间
消费者:
- Pull 模式:消费者自己去拉取消息,由于 queue 本身就是顺序写的,拉取到的消息也是顺序的,消费者需要保证顺序的消费
- Push 模式:消费者实例实现 MQPushConsumer 接口,提供注册监听的方法消费消息。使用 registerMessageListener() 重载方法
- MessageListenerOrderly:串行消费,consumer 会把消息放入本地队列并加锁,定时任务保证锁的同步。