如何保证发送消息有序
类比Kafka的ParitationKey,RocketMQ是messageQueue。
将需要保证顺序的消息发给RocketMQ的messageQueue,被同一个消费者消费,即可保证有序。
- 消费者在发送的时候可以指定selector,指定消息发给哪个messageQueue。
- 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);