RocketMQ如何保证消息的顺序性?
典型回答 和Kafka只支持同一个Partition内消息的顺序性一样,RocketMQ中也提供了基于队列(分区)的顺序消费。即同一个队列内的消息可以做到有序,但是不同队列内的消息是无序的! 当我们作为MQ的生产者需要发送顺序消息时,需要在send方法中,传入一个MessageQueueSelector。 MessageQueueSelector中需要实现一个select方法,这个方法就是用来定义要把消息发送到哪个MessageQueue的,通常可以使用取模法进行路由: 1 2 3 4 5 6 7 8 9 10 11 12 13 SendResult sendResult = producer.send(msg, new MessageQueueSelector() { @Override //mqs:该Topic下所有可选的MessageQueue //msg:待发送的消息 //arg:发送消息时传递的参数 public MessageQueue select(List<MessageQueue> mqs, Message msg, Object arg) { Integer id = (Integer) arg; //根据参数,计算出一个要接收消息的MessageQueue的下标 int index = id % mqs.size(); //返回这个MessageQueue return mqs.get(index); } }, orderId); 通过以上形式就可以将需要有序的消息发送到同一个队列中。需要注意的时候,这里需要使用同步发送的方式! ...