消息的顺序性
T00 Lv2

消息的顺序性错乱

在业务中,可能会有对某个订单的增删改操作,比如有三条sql执行顺序是增加、修改、删除;消费者换了顺序给执行成删除、修改、增加,这样能行吗?

肯定是不行的。

RabbitMQ

对于 RabbitMQ 来说,导致上面顺序错乱的原因通常是消费者是集群部署,不同的消费者消费到了同一订单的不同的消息,虽然消费者从MQ里面读取数据是有序的,但是可能因为每个消费者性能不同导致执行的顺序不同。

如消费者 A 执行了增加,消费者 B 执行了修改,消费者 C 执行了删除,但是消费者 C 执行比消费者 B 快,消费者 B 又比消费者 A 快,就会导致执行到数据库的时候顺序错乱,本该顺序是增加、修改、删除,变成了删除、修改、增加。

如图:

image

如何保证消息的顺序性

RabbitMQ

RabbitMQ 的问题是由于不同的消息都发送到了同一个queue中,多个消费者都消费同一个queue的消息。

解决这个问题:

  1. 我们可以给RabbitMQ创建多个queue,每个消费者固定消费一个queue的消息;
  2. 生产者发送消息的时候,同一个订单号的消息发送到同一个queue中;
  3. 由于同一个queue的消息是一定会保证有序的,那么同一个订单号的消息就只会被一个消费者顺序消费,从而保证了消息的顺序性。

如图:

image
  • 会使队列变多, 造成吞吐量下降,但是这种可以在消费者内部采用多线程的方式去消费。

总结

RabbitMQ

由于消费者的集群部署,同个队列中的消息可能会被个消费者消费,而每个消费者的性能不同,使用最终执行的顺序可能和我们预期的不同;

我们可以采用创建多个queue的方式,一个业务的消息只发给某一个队列,这一个队列也只由一个消费者消费,由于队列内的消息是有序的,所以消费者消费的顺序也是有序的

只是这样会造成吞吐量的下降,但是我们可以在消费者内部采用多线程的方式消费。

Powered by Hexo & Theme Keep
Total words 55.8k Unique Visitor Page View