RocketMQ 应用场景

2024年7月26日

Apache RocketMQ 作为一款分布式消息中间件,具备异步通信的优势,系统拓扑简单、上下游耦合较弱,主要应用于异步解耦,流量削峰填谷等场景。广泛应用于各种大规模分布式系统和微服务架构中,以实现高性能、低延迟的消息传递。
对于同步链路,需要实时返回调用结果的场景,建议使用 RPC 调用方案。

如上图所示,RocketMQ 中消息的生命周期主要分为“消息生产、消息存储、消息消费”这三部分。
生产者生产消息并发送至 RocketMQ 服务端,消息被存储在服务端的主题的队列中,消费者通过订阅主题消费消息。
消息生产
生产者(Producer):RocketMQ 中用于产生消息的运行实体,一般集成于业务调用链路的上游。生产者是轻量级匿名无身份的。
消息存储

  • 主题(Topic):RocketMQ 消息传输和存储的分组容器,主题内部由多个队列组成,消息的存储和水平扩展实际是通过主题内的队列实现的。
  • 队列(MessageQueue):RocketMQ 消息传输和存储的实际单元容器,类比于 Kafka 中的分区。RocketMQ 通过流式特性的无限队列结构来存储消息,消息在队列内具备顺序性存储特征。
  • 消息(Message):RocketMQ 的最小传输单元。消息具备不可变性,在初始化发送和完成存储后即不可变。

消息消费

  • 消费者分组(ConsumerGroup):RocketMQ 发布订阅模型中定义的独立的消费身份分组,用于统一管理底层运行的多个消费者(Consumer)。同一个消费组的多个消费者必须保持消费逻辑和配置一致,共同分担该消费组订阅的消息,实现消费能力的水平扩展。
  • 消费者(Consumer):RocketMQ 消费消息的运行实体,一般集成在业务调用链路的下游。消费者必须被指定到某一个消费组中。
  • 订阅关系(Subscription):RocketMQ 发布订阅模型中消息过滤、重试、消费进度的规则配置。订阅关系以消费组粒度进行管理,消费组通过定义订阅关系控制指定消费组下的消费者如何实现消息过滤、消费重试及消费进度恢复等。RocketMQ 的订阅关系除过滤表达式之外都是持久化的,即服务端重启或请求断开,订阅关系依然保留。

RocketMQ 典型应用场景

作为一款消息中间件,RocketMQ 的典型应用场景有:削峰填谷与流量控制、异步解耦。

削峰填谷与流量控制

在秒杀、大促等高并发场景下,RocketMQ 可以作为缓冲区,暂时存储大量涌入的请求,从而避免系统直接承受峰值压力,实现流量削峰。通过异步处理这些消息,系统可以平稳地处理高峰流量,保障服务稳定性。

异步解耦

RocketMQ 可以用来解耦系统组件,允许服务间的异步通信。这样服务就可以独立部署、升级,而不影响彼此,提高了系统的可扩展性和灵活性。

RocketMQ 特性消息的应用场景

顺序消息处理

在需要保证消息顺序的场景中,如金融交易系统中的订单处理(创建、支付、退款等),RocketMQ 支持顺序消息功能,确保消息严格按照发送顺序被消费,满足业务逻辑的一致性要求。

RocketMQ 顺序消息的特性非常适合那些对消息处理顺序有严格要求的业务场景,确保消息按照特定的顺序被消费,以维持业务逻辑的连贯性和一致性。以下是一些典型的使用 RocketMQ 顺序消息的业务场景:

  • 金融交易系统:在金融领域,如银行账户的转账、扣款、充值等操作,必须严格按照发生的顺序处理,以避免资金账户余额不准确,如先扣除金额再执行充值会导致短暂的账户透支问题。
  • 订单处理流程:电商平台的订单处理,包括创建订单、支付订单、发货通知、完成订单等步骤,这些操作需要按照特定顺序执行,以确保用户体验和业务流程的完整性。
  • 库存管理:在库存管理系统中,商品的入库、出库、盘点等操作需要顺序执行,以防止库存数据混乱,比如先扣减库存再进行商品销售确认,可能导致超卖现象。
  • 消息日志记录:在需要保持操作记录顺序的场景,如审计日志、操作历史追踪等,顺序消息可以保证记录的时序性,便于追踪和回溯。
  • 游戏状态同步:在线游戏中的用户操作,如移动、攻击、升级等,为了保持游戏世界的连贯性,这些操作的处理顺序至关重要,以免出现逻辑冲突或玩家体验受损。
  • 计费系统:电信、云服务等领域的计费系统,需要按照用户使用服务的顺序来计算费用,避免因计费顺序错误导致的计费争议。
  • 消息驱动的流程引擎:在工作流或业务流程自动化系统中,顺序消息可以作为流程节点之间的驱动器,确保每个步骤按照预定的顺序执行。

通过使用 RocketMQ 的顺序消息功能,可以确保在分布式系统中,即使消息被并行处理,也能维持业务逻辑所需的顺序,进而提高系统的可靠性和业务的正确性。

分布式事务支持

RocketMQ 提供了分布式事务消息功能,能够在分布式系统中实现事务的最终一致性。这使得跨服务的事务操作得以原子化执行,确保数据的一致性。

RocketMQ 的事务消息特性主要用于解决分布式系统中需要保持数据一致性的复杂场景,特别是当业务操作需要跨多个服务或数据库,且这些操作必须保持原子性时。以下是事务消息的几个典型业务场景:

  • 订单支付场景:用户在电商平台下单后,需要同时更新订单状态、扣减库存、处理支付等操作。事务消息可以确保这一系列操作要么全部成功,要么全部失败,避免出现订单已确认但库存未扣减或支付未完成的情况。
  • 金融交易:在转账、理财购买、贷款发放等金融交易中,事务消息能确保资金的划转与账户余额更新、交易记录生成等一系列操作保持一致,防止资金丢失或重复记账。
  • 库存扣减与订单创建:在库存管理中,当用户下单时,需确保库存扣减与订单创建同时成功或失败,避免超卖或订单错误。事务消息可以保证这一流程的原子性。
  • 票务系统:火车票、飞机票的预订和出票过程中,座位锁定与订单生成必须同步,事务消息可以确保不会出现座位已分配但订单未创建或相反的情况。
  • 用户注册与邮件/短信通知:在用户注册后,需要同时完成用户账户的创建与发送验证邮件/短信的操作,事务消息可以保证用户数据与通知消息的一致性。

通过事务消息,RocketMQ 提供了一种在分布式系统中实现事务一致性的有效手段,特别是在那些需要跨服务、跨数据库操作且保证数据一致性的场景中尤为重要。

延时消息与定时任务

RocketMQ 支持延时消息功能,可以设定消息在未来某一时间点被消费,适用于如订单超时自动取消、定时提醒等场景。
RocketMQ 的定时消息功能为分布式系统提供了强大的消息调度能力,允许消息在特定时间点之后才被消费者处理。这一特性适用于多种业务场景,确保消息处理与时间相关联,以下是几个典型的使用场景:

  • 订单超时处理:在电子商务平台中,可以利用定时消息来处理未支付的订单。例如,当用户下单后,系统发送一个延迟几分钟至几小时的定时消息,如果到时仍未支付,则自动取消订单,释放库存。
  • 系统任务调度:定时消息可以作为轻量级的任务调度工具,比如定期数据统计、报表生成、缓存清理、数据库维护任务等,无需额外的复杂调度系统。
  • 消息重试机制:在消息处理失败时,可以通过发送一个延迟的定时消息来实现自动重试机制,比如支付确认、通知发送失败等情况,避免即时重试带来的系统压力。
  • 营销活动触发:在营销活动中,可以预先设定好活动开始或结束的通知,通过定时消息在特定时间点自动触发达成营销效果,如促销活动的开始提醒、优惠券到期提醒等。
  • 系统通知与提醒:如用户生日祝福、账户到期提醒、定期报告发送等,通过定时消息自动触发,确保消息按时送达。
  • 金融交易确认:在需要一定时间确认的金融交易中,如转账确认、贷款审批通知等,可以设置定时消息在预期的确认时间后通知用户或更新系统状态。
  • 资源回收与清理:在云服务或资源分配场景中,可以安排定时消息来自动回收不再使用的资源,如临时生成的文件、过期的访问令牌等。
  • 社交应用的消息定时发送:如定时发送节日祝福、生日祝福等,提升用户体验。

通过上述场景可以看出,RocketMQ 的定时消息功能极大地丰富了分布式系统处理时间敏感型任务的能力,提高了系统的灵活性和自动化水平。

日志与监控数据收集

RocketMQ 可以作为日志或监控数据的收集管道,从各个服务收集信息,统一处理后发送至数据分析或监控平台,便于系统监控和故障排查。

服务编排与工作流

通过消息驱动的方式,RocketMQ 可以作为服务编排的工具,实现复杂工作流的自动化,如订单处理流程中的多个服务协同工作。

消息驱动的微服务架构

RocketMQ 可以作为微服务间通信的基础设施,实现事件驱动的微服务架构,提高系统的响应速度和可维护性。
这些应用场景展示了 RocketMQ 在现代分布式系统中的重要作用,它不仅帮助系统应对高并发挑战,也促进了系统的灵活扩展和高效协作。