文章摘自关于MQ面试的几件小事 | 如何保证消息按顺序执行 - 云+社区 - 腾讯云,增加了一些自己的理解。
1.为什么要保证顺序
消息队列中的若干消息如果是对同一个数据进行操作,这些操作具有前后的关系,必须要按前后的顺序执行,否则就会造成数据异常。举例: 比如通过mysql binlog进行两个数据库的数据同步,由于对数据库的数据操作是具有顺序性的,如果操作顺序搞反,就会造成不可估量的错误。比如数据库对一条数据依次进行了 插入->更新->删除操作,这个顺序必须是这样,如果在同步过程中,消息的顺序变成了 删除->插入->更新,那么原本应该被删除的数据,就没有被删除,造成数据的不一致问题。
2.出现顺序错乱的场景
①一个queue,有多个consumer去消费。因为每个consumer的执行时间是不固定的,先读到消息的consumer不一定先完成操作。
②一个queue对应一个consumer,但是consumer里面进行了多线程消费,这样也会造成消息消费顺序错误。
3.保证消息的消费顺序
首先得明白具有先后顺序的一组消息一定有一个字段的值是一样的,比如订单号。这样我们根据该字段值的Hash值判断发送那个队列,这样具有先后顺序的一组消息就一定在同一个队列,因为该字段值是一样的,所以hash值也是一样的。
①拆分多个queue,每个queue一个consumer。
②一个queue一个consumer,但是consumer将消息存到多个内存队列(存的逻辑和上面一样),每个内存队列都对应一个线程。