Skip to content

如何保证发送消息有序

类比Kafka的ParitationKey,RocketMQ是messageQueue。

将需要保证顺序的消息发给RocketMQ的messageQueue,被同一个消费者消费,即可保证有序。

  1. 消费者在发送的时候可以指定selector,指定消息发给哪个messageQueue。
  2. messageQueue是一个FIFO的队列,能够保证消费时按照写入消息的顺序去消费。

所以需要保证有顺序的消息,比如相同产品的订单,可以按照产品 code 设置 selector,保证消息发到同一个 messageQueue,这样就能被同一个消费者消费。

java
SendResult sendResult = producer.send(msg, new MessageQueueSelector() {
  //重写select
  //根据orderid指定messageQueue
    @Override
    public MessageQueue select(List<MessageQueue> mqs, Message msg, Object arg) {
        Integer id = (Integer) arg;
        int index = id % mqs.size();
        return mqs.get(index);
    }
 }, orderId);