消息的顺序性保证是指:消费者消费的消息和生产者发送的消息顺序是一致的.
应用场景:如用户修改信息,对同一个用户的同一个资料进行修改时,需保证消息的顺序,比如我短时间内对于我的昵称修改了两次,需要保证这个修改的两次操作的消息能够被消费者有序的消费,才能确保我最终修改的昵称是我最新修改后的昵称.
那么哪些情况可能会打破RabbitMQ的顺序性呢?
①:存在多个消费者:
(同一个队列存在多个消费者,消息被分配给不同消费者,处理速度不一致,打乱业务执行顺序)
②:网络波动或异常:
(生产者多线程发送消息,受网络波动影响,后发送的消息率先到达 RabbitMQ,队列里消息存储顺序错乱)
③:消息重试:
(消息发送或者消费失败触发重试,重试的消息排在队列末尾,打乱顺序)
④:消息路由问题:
(同一业务有序消息,routing‑key 不同,被路由分发到不同队列,队列之间互不保证顺序)
⑤:死信队列:
(消费失败消息进入死信队列,后期再次放回原队列末尾,导致时序错乱)
消息顺序性保障方案:
①:局部顺序性保证
②:全局顺序性保证
常见策略:
①:单队列设置单消费者:
(但如果只写 1 个队列 + 1 个消费者,只能单线程处理消息,吞吐量很低,可分区消费解决)
②:分区消费:
(通过消息分区划分多个队列,每个队列配置一个消费者,既保证消息局部有序,又可以提升整体消费效率)
③:消息确认机制(手动确认)
④:业务逻辑控制