这里插入一个比较常见的一个面试,那么如何保证保证消息的顺序性。
其实要想保证消息的顺序只要保证以下三点即可
1、生产者将需要保证顺序的消息发送到同一个队列 2、消息队列在存储消息的时候按照顺序存储 3、消费者按照顺序消费消息
第一点如何保证生产者将消息发送到同一个队列?
上文提到过RocketMQ生产者在发送消息的时候需要选择一个队列,并且选择算法是可以自定义的,这样我们只需要在根据业务需要,自定义队列选择算法,将顺序消息都指定到同一个队列,在发送消息的时候指定该算法,这样就实现了生产者发送消息的顺序性。
第二点,RocketMQ在存消息的时候,是按照顺序保存消息在ConsumeQueue中的位置的,由于消费消息的时候是先从ConsumeQueue查找消息的位置,这样也就保证了消息存储的顺序性。
第三点消费者按照顺序消费消息,这个RocketMQ已经实现了,只需要在消费消息的时候指定按照顺序消息消费即可,如下面所示,注册消息的监听器的时候使用MessageListenerOrderly这个接口的实现。
consumer.registerMessageListener(new MessageListenerOrderly() { @Override public ConsumeOrderlyStatus consumeMessage(List<MessageExt> msgs, ConsumeOrderlyContext context) { //按照顺序消费消息记录 return null; } });
还没有评论,来说两句吧...