Skip to content
章节导航

【核心知识】RocketMQ 顺序消息

生产端保证发送消息有序,且发送到同—个Topic的同个queue里面, RocketMQ的确是能保证 FIFO的。

例子:订单的顺序流程是:创建、付款、物流、完成,订单号相同的消息会被先后发送到同—个队列中, 根据 MessageQueueSelector 里面自定义策略,根据同个业务 id 放置到同个 queue 里面,如订单号取模运算再放到 selector 中,同—个模的值都会投递到同—条 queue

java
public MessageQueue select(List<MessageQueue> mqs, Message msg, Object arg) {
   //如果是订单号是字符串,则进行hash,得到—个hash值
   Long id = (Long) arg;
   long index = id % mqs.size();
   return mqs.get((int)index);
}

消费端要在保证消费同个 topic 里的同个队列,不应该用MessageListenerConcurrently, 应该使用 MessageListenerOrderly,自带单线程消费消息,不能再Consumer端再使用多线程去消费,消费端分配到的 queue 数量是固定的,集群消会锁住当前正在消费的队列集合的消息,所以会保证顺序消费。

官方例子 https://rocketmq.apache.org/docs/order-example/