如何保证消息顺序性?

场景:
在一个订单场景中,本来我们期望的是订单生成,订单支付,订单完成这样一个流程下来,但是消费者一般部署集群,多个消费者消费一个队列queue,很可能订单支付在订单完成前执行,这样肯定是不行的。
如何保证消息顺序性?
那么如何解决一个队列多消费者的问题呢?
对于RabbitMQ或kafka而言,我们可以多搞几个队列,每个队列对应一个消费者,这样我们生产端通过一个业务id比如订单id,同样的订单id的消息发到同一个队列,这样就可以保证局部顺序了。
但如果消费者服务是多线程处理该消息,还是会出现顺序问题,所以我们在消费者内部搞个内部队列,这样同一类消息还是到同一个内存队列消费,保证消息消费的顺序性。
如何保证消息顺序性?
对于RocketMQ,生产端同样通过MessageQueueSelector把订单id相同的数据放到同一个队列,至于多个消费者消费队列里的消息时,使用的是分布式锁,MessageListenerConcurrently实现了分布式锁,一旦有消费者在消费队列的消息,就会锁住当前队列,直到消费完成才会释放锁。

参考:
https://www.wandouip.com/t5i358407/
https://www.jianshu.com/p/931e9bc25c21