MQ中怎样去实现消息的顺序消费

常见的MQ中间件中,RocketMQ实现了顺序消费的支持,其他的MQ基本都是没有在MQ层面做顺序消费方面的支持的,毕竟要保证顺序就会对性能带来很大的影响。

消费的顺序性问题

当消息不在同一个队列中或者同一队列有多个消费者消费的情况下才会有消费的顺序性问题,如果只有一个队列,只有一个消费者且每次都获取一条消息进行消费,那么消息一定是按顺序消费的。

全局顺序消费

  • 所有进入MQ的消息都要保证顺序消费,如果要实现这种顺序性会大幅度降低MQ的性能。

局部顺序消费

  • 局部顺序消费是在某些场景的消息需要按顺序消费,例如创建订单,付款,发货是有序的流程,付款不能在创建订单之前

顺序消费的实现方式

1.单Queue+单消费者模式

  • 如果业务简单MQ消息堆积也小,那就可以使用一个Queue和一个消费者来确保消息的顺序消费,这样依赖只要消息是按顺序生产投入同一个Queue中的的,就可以按投入的顺序被同一个消费者消费

2.消息体顺序标识+落库+消费者逻辑判断

  • 在需要顺序消费的消息体中添加顺序标识和分组标识,发送后存入数据表,消费者接收消息消费前,查询数据表判断属于同一分组内顺序靠前的消息有没有被消费,如果没有就拒绝ack重新被投递。

拿点餐场景举例说明下

下单和取消订单分别对应一条订单号为1234顺序为10的息和一条订单号为1234顺序为20的消息,生产者发送后把两条消息存入数据库,如果取消订单的消息先被消费者先接收到,在执行消费逻辑前首先要查询数据表有没有订单号1234的顺序小于20的消息,有的话是否已经被消费,如果没有被消费则拒绝ack,一直到下单消息被消费后才可以执行对取消订单消息的消费

猜你喜欢

转载自blog.csdn.net/qq_29569183/article/details/115036108