1. 简介
实际开发中会有以下场景,需要保证一组消息的生产顺序与消费顺序相同,例如
- 监听数据库表单条数据的的多次修改,需要保证监听者最终得到的消息顺序和数据库表对单条数据的修改顺序一样
- 网购平台创建订单的过程一般都是异步实现,订单创建和支付流程需要保证最终到服务器的顺序一致
那么在 RocketMQ 中该如何保证消息的顺序呢?
2. RocketMQ 中该如何保证消息的顺序呢?
首先查看一条消息从生产者到消费者的流程:
- 生产者: 生产者可以有多个 每个生产者可以向 topic 的任意队列写数据
- 消费者 消费者存在于消费者组当中,消费者组可以存在多个消费者 每一个队列在同一时间只能被同一消费者组内的一个消费者消费,但是同一消费者可以同时消费多个队列
想要保证消息的顺序需要满足以下条件:
- 生产者生产消息保证顺序一致
- 生产者生产的消息最终到达 broker 且被处理的顺序一致
- broker 保证先后到达消息最终处理的结果顺序一致
- 消费者可以按照固定顺序去拉取并处理消息
下面我们以一条订单的创建看满足这些条件需要做些什么: 假设一条订单从创建到支付有四个节点,创建订单、提交支付、支付、支付成功
- 用户在页面操作可以保证四个节点必定是按照固定顺序去生产的四条消息,但是最终到达 broker 的顺序却不一定按照生产者发起消息请求到 broker 的顺序,因为网络交互过程是存在不确定性的,先出发的可能后到,后出发的可能先到。
- 所以在生产者发送消息时需要由生产者去保证消息顺序,在创建订单完成后再去发送提交支付请求,在提交支付请求完成后再去发送支付请求
- broker 保证消息顺序一致,可以查看大标题 《3. broker