通过分区规则可以实现同类消息在rocketmq上的顺序存储。但是对于消费端来说,如何保证消费的顺序?
我们前面写的消息消费代码使用的是MessageListenerConcurrently并发监听,也就是基于多个线程并行来消费消息。这个无法保证消息消费的顺序。RocketMQ中提供了MessageListenerOrderly 一个类来实现顺序消费,
consumer.subscribe("store_topic_test","*");
consumer.registerMessageListener((MessageListenerOrderly) (list,
consumeOrderlyContext) -> {
list.stream().forEach(messageExt -> System.out.println(new
String(messageExt.getBody())));
return ConsumeOrderlyStatus.SUCCESS;
});
顺序消费会带来一些问题,
1. 遇到消息失败的消息,无法跳过,当前队列消费暂停
2. 降低了消息处理的性能