消息的顺序性
消息的顺序性错乱
在业务中,可能会有对某个订单的增删改操作,比如有三条sql执行顺序是增加、修改、删除;消费者换了顺序给执行成删除、修改、增加,这样能行吗?
肯定是不行的。
RabbitMQ
对于 RabbitMQ 来说,导致上面顺序错乱的原因通常是消费者是集群部署,不同的消费者消费到了同一订单的不同的消息,虽然消费者从MQ里面读取数据是有序的,但是可能因为每个消费者性能不同导致执行的顺序不同。
如消费者 A 执行了增加,消费者 B 执行了修改,消费者 C 执行了删除,但是消费者 C 执行比消费者 B 快,消费者 B 又比消费者 A 快,就会导致执行到数据库的时候顺序错乱,本该顺序是增加、修改、删除,变成了删除、修改、增加。
如图:
如何保证消息的顺序性
RabbitMQ
RabbitMQ 的问题是由于不同的消息都发送到了同一个queue中,多个消费者都消费同一个queue的消息。
解决这个问题:
- 我们可以给RabbitMQ创建多个
queue,每个消费者固定消费一个queue的消息; - 生产者发送消息的时候,同一个订单号的消息发送到同一个
queue中; - 由于同一个
queue的消息是一定会保证有序的,那么同一个订单号的消息就只会被一个消费者顺序消费,从而保证了消息的顺序性。
如图:
- 会使队列变多, 造成吞吐量下降,但是这种可以在消费者内部采用多线程的方式去消费。
总结
RabbitMQ
由于消费者的集群部署,同一个队列中的消息可能会被多个消费者消费,而每个消费者的性能不同,使用最终执行的顺序可能和我们预期的不同;
我们可以采用创建多个queue的方式,一个业务的消息只发给某一个队列,这一个队列也只由一个消费者消费,由于队列内的消息是有序的,所以消费者消费的顺序也是有序的;
只是这样会造成吞吐量的下降,但是我们可以在消费者内部采用多线程的方式消费。