跳到主要内容
版本:5.0

领域模型

本节介绍 Apache RocketMQ 的领域模型。

Apache RocketMQ 是一种分布式中间件服务,采用异步通信模型和发布/订阅消息传输模型。

有关通信模型和传输模型的更多信息,请参见通信模型消息传输模型

Apache RocketMQ 的异步通信模型具有系统拓扑简单和上下游弱耦合的特点。Apache RocketMQ 用于异步解耦和削峰填谷场景。

Apache RocketMQ 领域模型

领域模型

如上图所示,Apache RocketMQ 消息的生命周期由三个阶段组成:生产、存储和消费。

生产者生成消息并将其发送到 Apache RocketMQ broker。消息存储在 broker 上的主题中。消费者订阅主题以消费消息。

消息生产

生产者

在 Apache RocketMQ 中用于生成消息的运行实体。生产者是业务调用链路的上游部分。生产者是轻量级的、匿名的,并且没有身份。

消息存储

  • 主题

    在 Apache RocketMQ 中用于消息传输和存储的分组容器。一个主题由多个消息队列组成,这些消息队列用于存储消息和扩展主题。

  • 消息队列

    在 Apache RocketMQ 中用于消息传输和存储的单元容器。消息队列类似于 Kafka 中的分区。Apache RocketMQ 基于无限队列结构以流式方式存储消息。消息按顺序存储在队列中。

  • 消息

    Apache RocketMQ 中数据传输的最小单元。消息在初始化和存储后是不可变的。

消息消费

  • 消费组

    在 Apache RocketMQ 的发布/订阅模型中定义的一组独立的消费身份。消费组用于集中管理底层运行的消费者。同一组中的消费者必须保持相同的消费逻辑和配置,并共同消费该组订阅的消息,以扩展该组的消费能力。

  • 消费者

    在 Apache RocketMQ 中用于消费消息的运行实体。消费者是业务调用链路的下游部分。消费者必须属于特定的消费组。

  • 订阅

    Apache RocketMQ 发布/订阅模型中的配置集合。配置包括消息过滤、重试和消费者进度。订阅在消费组级别进行管理。您可以使用消费组来指定订阅,以管理组中的消费者如何过滤消息、重试消费以及恢复消费者偏移量。

    Apache RocketMQ 订阅中的配置(过滤表达式除外)都是持久化的。无论 broker 重启还是连接关闭,订阅都不会改变。

通信模型

根据分布式系统架构的概念,一个复杂的系统可以拆分为多个独立的模块,例如微服务模块。系统中必须确保模块之间的远程通信。为此,有两种典型的通信模型:基于 RPC 的同步通信模型和基于中间件的异步通信模型。

基于 RPC 的同步模型

Synchronous invocation

在此模型中,远程系统直接相互通信。每个请求都直接从调用者发送到被调用者,被调用者立即将调用结果返回给调用者。注意 “同步”一词并非指编程接口的模式。RPC 也支持异步非阻塞调用的编程模式,在这种情况下,调用者仍然期望在指定时间内从被调用者那里获得直接响应。

异步通信模型 异步调用

在此模型中,子系统之间没有紧密耦合的连接。调用者只需将请求转换为异步事件或消息,并将其发送给代理。只要消息发送成功,调用即视为完成。代理将消息传递给被调用的下游子系统,并确保任务完成。代理的角色通常由消息中间件承担。

异步通信具有以下优点

  • 系统拓扑简单。由于调用者和被调用者都只与代理通信,因此系统以星形结构运行,易于维护和管理。
  • 上下游弱耦合。弱耦合使系统结构更具灵活性。代理执行缓冲和异步恢复。部署在上游和下游的系统可以独立升级和更改,互不影响。
  • 削峰填谷。面向消息的代理通常提供大的流量缓冲区和强大的流量整形能力。这可以防止流量高峰淹没下游系统。

消息传输模型

消息中间件服务有两种常见的传输模型:点对点模型和发布/订阅模型。

点对点模型 点对点模型

点对点模型,也称为队列模型,具有以下特点

  • 消费者匿名:队列是上下游通信中使用的唯一身份。下游消费者从队列中获取消息时无法声明身份。

  • 一对一通信:消费者没有身份。消费组中的所有消费者共同消费订阅的消息。每条消息只能由一个特定的消费者消费。因此,此模型仅支持一对一通信。

发布/订阅模型 发布/订阅模型

该模型具有以下特点

  • 独立消费:在此模型中,消费者使用消费组或订阅的身份来接收和消费消息。消费组之间是相互独立的。

  • 一对多通信:基于独立身份的设计,此模型允许一个主题被多个消费组订阅,每个消费组都可以完全访问所有消息。因此,发布/订阅模型支持一对多通信。

传输模型对比

点对点模型结构更简单,而发布/订阅模型提供了更好的可扩展性。Apache RocketMQ 使用发布/订阅模型,并具有与该模型相同的高可扩展性。