什么是顺序消费?乱序消费消息的原因是什么?
(1)顺序消费是指:同一个业务数据的多条消息(增删改)由生产者生产后,我们希望消费者在消费消息时能按照消息的生产顺序来进行消费,而不是无序消费。
(2)乱序消费原因:其实MQ是能保证消息按先后顺序被消费者获取,原因在于如果有多个消费者实例监听一个队列,它们拿到的消息不同,并且消费者实例的机器性能也不一样,就有可能后来的消息先被消费(先消费成功),先来的消息后被消费(后消费成功),产生不可预知的错误;如果消费者实例是用线程池处理消息,那么也有可能导致乱序消费。
为什么要保证消息顺序消费?
场景:项目有时候需要同步某一个系统的数据到数据部门的数据库中,一般是通过Canal等监听组件去监听binlog,再把监听到的数据发送到MQ中,最后数据部门抓取消息消费,将系统的数据落盘。binlog日志中记录着数据的增删改语句,如果消费者是乱序消费(不按照binlog日志的生产顺序),就有可能导致数据发生异常。
如何保证顺序消费消息?
(1)既然多个消费者实例会导致乱序消费,那我们就让一个消费者实例Consumer监听一个队列queue,MQ会保证消费者实例抓取的消息是有序的。
(2)如果关于同一个业务数据的多条消息被分发到了不同的queue中,也会导致乱序消费问题。在生产者生产消息时,用业务数据的唯一标识计算一个哈希值并对queue的个数取模,让其路由到一个特定的queue中,之后关于这个业务数据的多条消息都会路由到同一个queue中,消费者就能有序的处理关于这个业务数据的多条消息。