跳至主要内容
版本: 5.0

领域模型

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

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

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

Apache RocketMQ 的异步通信模型具有简单的系统拓扑结构和弱上游-下游耦合。Apache RocketMQ 用于异步解耦和负载转移场景。

Apache RocketMQ 的领域模型

领域模型

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

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

消息生产

生产者

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

消息存储

  • 主题

    在 Apache RocketMQ 中用于消息传输和存储的分组容器。主题包含多个消息队列,用于存储消息并扩展主题。

  • 消息队列

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

  • 消息

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

消息消费

  • 消费者组

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

  • 消费者

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

  • 订阅

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

    Apache RocketMQ 订阅中的配置都是持久化的,除了过滤表达式。无论代理是否重启或连接是否关闭,订阅都不会改变。

通信模型

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

基于 RPC 的同步模型

Synchronous invocation

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

异步通信模型 异步调用

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

异步通信提供以下好处

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

消息传输模型

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

点对点模型 点对点模型

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

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

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

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

此模型具有以下特点

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

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

传输模型比较

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