顺序消息

更新时间:2025-03-28 06:22:12

顺序消息可以保证消息的消费顺序和发送的顺序一致,即先发送的先消费,后发送的后消费,常用于金融证券、电商业务等对消息指令顺序有严格要求的场景。本文介绍云消息队列 RocketMQ 版顺序消息的概念、适用场景、实现原理以及使用过程中的注意事项。

什么是顺序消息

顺序消息是云消息队列 RocketMQ 版提供的一种对消息发送和消费顺序有严格要求的消息。对于一个指定的Topic,消息严格按照先进先出(FIFO)的原则进行消息发布和消费,即先发布的消息先消费,后发布的消息后消费。

分区顺序消息

对于指定的一个Topic,所有消息根据Sharding Key进行区块分区,同一个分区内的消息按照严格的先进先出(FIFO)原则进行发布和消费。同一分区内的消息保证顺序,不同分区之间的消息顺序不做要求。

  • 适用场景

    适用于性能要求高,以Sharding Key作为分区字段,在同一个区块中严格地按照先进先出(FIFO)原则进行消息发布和消费的场景。

  • 示例

    • 用户注册需要发送验证码,以用户ID作为Sharding Key,那么同一个用户发送的消息都会按照发布的先后顺序来消费。

    • 电商的订单创建,以订单ID作为Sharding Key,那么同一个订单相关的创建订单消息、订单支付消息、订单退款消息、订单物流消息都会按照发布的先后顺序来消费。

阿里巴巴集团内部电商系统均使用分区顺序消息,既保证业务的顺序,同时又能保证业务的高性能。

如何实现顺序消息

下文介绍在云消息队列 RocketMQ 版中如何保证消息收发的顺序。顺序消息1.0

云消息队列 RocketMQ 版中,消息的顺序需要由以下三个阶段保证:

  • 消息发送

    如上图所示,A1、B1、A2、A3、B2、B3是订单A和订单B的消息产生的顺序,业务上要求同一订单的消息保持顺序,例如订单A的消息发送和消费都按照A1、A2、A3的顺序。如果是普通消息,订单A的消息可能会被轮询发送到不同的队列中,不同队列的消息将无法保持顺序,而顺序消息发送时云消息队列 RocketMQ 版支持将Sharding Key相同(例如同一订单号)的消息序路由到一个队列中。

    云消息队列 RocketMQ 版服务端判定消息产生的顺序性是参照同一生产者发送消息的时序。不同生产者、不同线程并发产生的消息,云消息队列 RocketMQ 版服务端无法判定消息的先后顺序。

  • 消息存储

    如上图所示,顺序消息的Topic中,每个逻辑队列对应一个物理队列,当消息按照顺序发送到Topic中的逻辑队列时,每个分区的消息将按照同样的顺序存储到对应的物理队列中。

  • 消息消费

    云消息队列 RocketMQ 版按照存储的顺序将消息投递给Consumer,Consumer收到消息后也不对消息顺序做任何处理,按照接收到的顺序进行消费。

    Consumer消费消息时,同一Sharding Key的消息使用单线程消费,保证消息消费顺序和存储顺序一致,最终实现消费顺序和发布顺序的一致。

注意事项

  • 同一个Group ID只对应一种类型的Topic,即不同时用于顺序消息和无序消息的收发。

  • 云消息队列 RocketMQ 版服务端判定消息产生的顺序性是参照单一生产者、单一线程并发下消息发送的时序。如果发送方有多个生产者或者有多个线程并发发送消息,则此时只能以到达云消息队列 RocketMQ 版服务端的时序作为消息顺序的依据,和业务侧的发送顺序未必一致。

顺序消息常见问题

  • 同一条消息是否可以既是顺序消息,又是定时消息和事务消息?

    不可以。顺序消息、定时消息、事务消息是不同的消息类型,三者是互斥关系,不能叠加在一起使用。

  • 顺序消息支持哪些地域?

    支持云消息队列 RocketMQ 版所有公共云地域和金融云地域。

  • 顺序消息支持哪种消息发送方式?

    顺序消息只支持可靠同步发送方式,不支持异步发送方式,否则将无法严格保证顺序。

  • 顺序消息是否支持集群消费和广播消费?

    顺序消息暂时仅支持集群消费模式,不支持广播消费模式。

TCP SDK示例代码

TCP协议下的示例代码请参见以下文档:

HTTP SDK示例代码

HTTP协议下的示例代码请参见以下文档:

  • 本页导读 (1)
  • 什么是顺序消息
  • 分区顺序消息
  • 如何实现顺序消息
  • 注意事项
  • 顺序消息常见问题
  • TCP SDK示例代码
  • HTTP SDK示例代码
AI助理

点击开启售前

在线咨询服务

你好,我是AI助理

可以解答问题、推荐解决方案等