ROCKETMQ

消息队列(五)如何保证消息的顺序性?

一、为什么出现顺序错乱?在生产中经常会有一些类似报表系统这样的系统,需要做MySQL的binlog同步。比如订单系统要同步订单表的数据到大数据部门的MySQL库中用于报表统计分析,通常的做法是基于Canal这样的中间件去监听订单数据库的binlog,然后把这些binlog发送到MQ中,再由消费者从MQ中获取binlog落地到大数据部门的MySQL中。在这个过程中,可能会有对某个订单的增删改操作,比

一、为什么出现顺序错乱?

在生产中经常会有一些类似报表系统这样的系统,需要做 MySQL 的 binlog 同步。比如订单系统要同步订单表的数据到大数据部门的 MySQL 库中用于报表统计分析,通常的做法是基于 Canal 这样的中间件去监听订单数据库的 binlog,然后把这些 binlog 发送到 MQ 中,再由消费者从 MQ 中获取 binlog 落地到大数据部门的 MySQL 中。


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

1、RabbitMQ 消息顺序错乱

对于 RabbitMQ 来说,导致上面顺序错乱的原因通常是消费者是集群部署,不同的消费者消费到了同一订单的不同的消息,如消费者 A 执行了增加,消费者 B 执行了修改,消费者 C 执行了删除,但是消费者 C 执行比消费者 B 快,消费者 B 又比消费者 A 快,就会导致消费 binlog 执行到数据库的时候顺序错乱,本该顺序是增加、修改、删除,变成了删除、修改、增加。


如下图是 RabbitMQ 可能出现顺序错乱的问题示意图:


2、Kafka 消息顺序错乱

对于 Kafka 来说,一个 topic 下同一个 partition 中的消息肯定是有序的,生产者在写的时候可以指定一个 key,通过我们会用订单号作为 key,这个 key 对应的消息都会发送到同一个 partition 中,所以消费者消费到的消息也一定是有序的。


那么为什么 Kafka 还会存在消息错乱的问题呢?问题就出在消费者身上。通常我们消费到同一个 key 的多条消息后,会使用多线程技术去并发处理来提高消息处理速度,否则一条消息的处理需要耗时几十 ms,1 秒也就只能处理几十条消息,吞吐量就太低

原创不易,完成人机校验,阅读全文

相关推荐