顺序消息 ============================================ 本文主要介绍消息队列 RocketMQ 顺序消息的概念、适用场景以及使用过程中的注意事项。 概念介绍 --------------------- 顺序消息(FIFO 消息)是消息队列 RocketMQ 提供的一种严格按照顺序进行发布和消费的消息类型。 顺序消息指消息发布和消息消费都按顺序进行。 - 顺序发布:对于指定的一个 Topic,客户端将按照一定的先后顺序发送消息。 - 顺序消费:对于指定的一个 Topic,按照一定的先后顺序接收消息,即先发送的消息一定会先被客户端接收到。 全局顺序 ~~~~~~~~~~~~~~~~ 对于指定的一个 Topic,所有消息按照严格的先入先出(FIFO)的顺序进行发布和消费。 .. figure:: http://docs-aliyun.cn-hangzhou.oss.aliyun-inc.com/assets/pic/49319/cn_zh/1534917028902/%E5%85%A8%E5%B1%80%E9%A1%BA%E5%BA%8F.png :alt: ordered-msg-1 适用场景 性能要求不高,所有的消息严格按照 FIFO 原则进行消息发布和消费的场景。 示例 在证券处理中,以人民币兑换美元为 Topic,在价格相同的情况下,先出价者优先处理,则可以通过全局顺序的方式按照 FIFO 的方式进行发布和消费。 分区顺序 ~~~~~~~~~~~~~~~~ 对于指定的一个 Topic,所有消息根据 sharding key 进行区块分区。 同一个分区内的消息按照严格的 FIFO 顺序进行发布和消费。 Sharding key 是顺序消息中用来区分不同分区的关键字段,和普通消息的 Key 是完全不同的概念。 .. figure:: http://docs-aliyun.cn-hangzhou.oss.aliyun-inc.com/assets/pic/49319/cn_zh/1534917248438/%E5%88%86%E5%8C%BA%E9%A1%BA%E5%BA%8F2.png :alt: ordered-msg-2 适用场景 性能要求高,以 sharding key 作为分区字段,在同一个区块中严格的按照 FIFO 原则进行消息发布和消费的场景。 示例 - 例一:用户注册需要发送发验证码,以用户 ID 作为 sharding key, 那么同一个用户发送的消息都会按照先后顺序来发布和消费 - 例二:电商的订单创建,以订单 ID 作为 sharding key, 那么同一个订单相关的创建订单消息、订单支付消息、订单退款消息、订单物流消息都会按照先后顺序来发布和消费。 阿里巴巴集团内部电商系统均使用分区顺序消息,既保证业务的顺序,同时又能保证业务的高性能。 全局顺序与分区顺序对比 --------------------- 在控制台创建顺序消息使用的不同类型 Topic 对比如下。 消息类型对比 +---------------------------------------+--------------+-------------------+------+ | Topic 的消息类型 | 支持事务消息 | 支持定时/延时消息 | 性能 | +=======================================+==============+===================+======+ | 无序消息(普通、事务、定时/延时消息) | 是 | 是 | 最高 | +---------------------------------------+--------------+-------------------+------+ | 分区顺序消息 | 否 | 否 | 高 | +---------------------------------------+--------------+-------------------+------+ | 全局顺序消息 | 否 | 否 | 一般 | +---------------------------------------+--------------+-------------------+------+ 发送方式对比 +---------------------------------------+------------------+------------------+------------------+ | 消息类型 | 支持可靠同步发送 | 支持可靠异步发送 | 支持 Oneway 发送 | +---------------------------------------+------------------+------------------+------------------+ | 无序消息(普通、事务、定时/延时消息) | 是 | 是 | 是 | +---------------------------------------+------------------+------------------+------------------+ | 分区顺序消息 | 是 | 否 | 否 | +---------------------------------------+------------------+------------------+------------------+ | 全局顺序消息 | 是 | 否 | 否 | +---------------------------------------+------------------+------------------+------------------+ 注意事项 --------------------- - 顺序消息暂不支持广播模式。 - 建议同一个 Group ID 只对应一种类型的 Topic,即不同时用于顺序消息和无序消息的收发。 - 顺序消息不支持异步发送方式,否则将无法严格保证顺序。 - 对于全局顺序消息,建议创建实例个数 >=2。 同时运行多个实例的作用是为了防止工作实例意外退出时,业务中断。 当工作实例退出时,其他实例可以立即接手工作,不会导致业务中断,实际同时工作的只会有一个实例。 SDK 支持和示例代码 --------------------- 请使用 Java SDK 1.2.7 及以上版本。 示例代码请参考以下文档: - Java 收发送顺序消息 - C/C++ 收发顺序消息 - .NET 收发顺序消息