当我们的系统中引入了MQ之后,不得不考虑的一个问题是如何保证消息的顺序性,这是一个至关重要的事情,如果顺序错乱了,就会导致数据的不一致。
比如:业务场景是这样的:我们需要根据mysql的binlog日志同步一个数据库的数据到另一个库中,加如在binlog中对同一条数据做了insert,update,delete操作,我们往MQ顺序写入了insert,update,delete操作的三条消息,那么根据分析,最终同步到另一个库中,这条数据是被删除了的。但是,如果这三条消息不是按照insert,update,delete顺序被消费,而是按照delete,insert,update的顺序被消费,那么最终这条数据是会保存到新库中的。这就导致了数据错乱了。下面分别讲解下RabbitMQ和Kafka是如何保证消息的顺序性。
1、RabbitMQ如何保证消息顺序性
1.1 RabbitMQ的消息不被顺序消费的情况
注意:queue(队列)中的消息只能被一个消费者所消费,然后消费者在消费消息的过程中是无序的。如上图所示,如果按照BAC的消费顺序,那么最终数据库中是被保存这条数据的。这和我们预期的结果不符,如果这样的情况很多,那么就造成了数据库中的数据完成不对,同步工作也是白费了。
1.2 RabbitMQ保证消息顺序性的措施
如图所示,RabbitMQ保证消息的顺序性,就是拆分多个
queue,每个 queue 对应一个 consumer(消费者),就是多一些 queue 而已,确实是麻烦点;或者就一个 queue
但是对应一个 consumer,然后这个 consumer 内部用内存队列做排队,然后分发给底层不同的 worker 来处理。
相关文章
- 06-24阿里IM技术分享(五):闲鱼亿级IM消息系统的及时性优化实践
- 06-24合并顺序表 (25 分)假设有两个由小到大有序的有序顺序表A和B,现要求将表A和表B并入表C中,且表C仍保持由小到大的有序性。若合并后的顺序表表长超过总容量20,则输出“not enough”。
- 06-24kafka分布式的情况下,如何保证消息的顺序?
- 06-24如何让Kafka在保证高性能、高吞吐的同时通过各种机制来保证高可用性?
- 06-24我的架构梦:(八十八)消息中间件之Kafka如何保证幂等性
- 06-24从入门到入土(三)RocketMQ 怎么保证的消息不丢失?
- 06-24rabbitMQ 携带消息体之外的消息 使用 MessageProperties
- 06-24消息队列---RabbitMQ的学习(六)
- 06-24RabbitMQ,为应对消息从发送到消费,各个环节消息丢失的解决方案
- 06-24痞子衡嵌入式:探析开启CRC完整性校验的IAR工程生成.out和.bin文件先后顺序