顺序消息¶
本文主要介绍消息队列 RocketMQ 顺序消息的概念、适用场景以及使用过程中的注意事项。
概念介绍¶
顺序消息(FIFO 消息)是消息队列 RocketMQ 提供的一种严格按照顺序进行发布和消费的消息类型。 顺序消息指消息发布和消息消费都按顺序进行。
顺序发布:对于指定的一个 Topic,客户端将按照一定的先后顺序发送消息。
顺序消费:对于指定的一个 Topic,按照一定的先后顺序接收消息,即先发送的消息一定会先被客户端接收到。
全局顺序¶
对于指定的一个 Topic,所有消息按照严格的先入先出(FIFO)的顺序进行发布和消费。

适用场景
性能要求不高,所有的消息严格按照 FIFO 原则进行消息发布和消费的场景。
示例
在证券处理中,以人民币兑换美元为 Topic,在价格相同的情况下,先出价者优先处理,则可以通过全局顺序的方式按照 FIFO 的方式进行发布和消费。
分区顺序¶
对于指定的一个 Topic,所有消息根据 sharding key 进行区块分区。 同一个分区内的消息按照严格的 FIFO 顺序进行发布和消费。 Sharding key 是顺序消息中用来区分不同分区的关键字段,和普通消息的 Key 是完全不同的概念。

适用场景
性能要求高,以 sharding key 作为分区字段,在同一个区块中严格的按照 FIFO 原则进行消息发布和消费的场景。
示例
例一:用户注册需要发送发验证码,以用户 ID 作为 sharding key, 那么同一个用户发送的消息都会按照先后顺序来发布和消费
例二:电商的订单创建,以订单 ID 作为 sharding key, 那么同一个订单相关的创建订单消息、订单支付消息、订单退款消息、订单物流消息都会按照先后顺序来发布和消费。
阿里巴巴集团内部电商系统均使用分区顺序消息,既保证业务的顺序,同时又能保证业务的高性能。
全局顺序与分区顺序对比¶
在控制台创建顺序消息使用的不同类型 Topic 对比如下。
消息类型对比
Topic 的消息类型 |
支持事务消息 |
支持定时/延时消息 |
性能 |
---|---|---|---|
无序消息(普通、事务、定时/延时消息) |
是 |
是 |
最高 |
分区顺序消息 |
否 |
否 |
高 |
全局顺序消息 |
否 |
否 |
一般 |
发送方式对比
消息类型 |
支持可靠同步发送 |
支持可靠异步发送 |
支持 Oneway 发送 |
无序消息(普通、事务、定时/延时消息) |
是 |
是 |
是 |
分区顺序消息 |
是 |
否 |
否 |
全局顺序消息 |
是 |
否 |
否 |
注意事项¶
顺序消息暂不支持广播模式。
建议同一个 Group ID 只对应一种类型的 Topic,即不同时用于顺序消息和无序消息的收发。
顺序消息不支持异步发送方式,否则将无法严格保证顺序。
对于全局顺序消息,建议创建实例个数 >=2。 同时运行多个实例的作用是为了防止工作实例意外退出时,业务中断。 当工作实例退出时,其他实例可以立即接手工作,不会导致业务中断,实际同时工作的只会有一个实例。