领域模型
本节介绍 Apache RocketMQ 的领域模型。
Apache RocketMQ 是一款采用异步通信模型和发布/订阅消息传输模型的分布式中间件服务。
有关通信模型和传输模型的更多信息,请参阅通信模型和消息传输模型。
Apache RocketMQ 的异步通信模型具有系统拓扑简单、上下游耦合度低的特点。Apache RocketMQ 常用于异步解耦和削峰填谷场景。
Apache RocketMQ 领域模型

如上图所示,Apache RocketMQ 消息的生命周期包含三个阶段:生产、存储和消费。
生产者生成消息并将其发送到 Apache RocketMQ Broker。消息存储在 Broker 的 Topic 中。消费者订阅该 Topic 以消费消息。
消息生产
用于在 Apache RocketMQ 中生成消息的运行实体。生产者是业务调用链路的上游部分。生产者是轻量级的、匿名的,且不具备身份标识。
消息存储
Apache RocketMQ 中用于消息传输和存储的分组容器。一个 Topic 由多个消息队列组成,用于存储消息并实现 Topic 的横向扩展。
Apache RocketMQ 中用于消息传输和存储的单元容器。消息队列类似于 Kafka 中的分区(Partition)。Apache RocketMQ 基于无限队列结构以流式方式存储消息。消息在队列中按顺序存储。
Apache RocketMQ 中数据传输的最小单元。消息在初始化和存储后是不可变的。
消息消费
Apache RocketMQ 发布/订阅模型中定义的独立消费身份组。消费者组用于集中管理底层运行的消费者。同一组内的消费者必须保持相同的消费逻辑和配置,共同消费组内订阅的消息,以扩展该组的消费能力。
用于在 Apache RocketMQ 中消费消息的运行实体。消费者是业务调用链路的下游部分,消费者必须属于特定的消费者组。
Apache RocketMQ 发布/订阅模型中的配置集合。这些配置包括消息过滤、重试和消费进度。订阅在消费者组级别进行管理。通过消费者组指定订阅,可以管理组内消费者如何过滤消息、重试消费以及恢复消费位点。
除过滤表达式外,Apache RocketMQ 订阅中的所有配置都是持久化的。无论 Broker 重启还是连接关闭,订阅状态始终保持不变。
通信模型
根据分布式系统架构的概念,一个复杂的系统可以拆分为多个独立的模块(例如微服务模块)。系统必须确保模块之间的远程通信。为此,有两种典型的通信模型:基于 RPC 的同步通信模型和基于中间件的异步通信模型。
基于 RPC 的同步模型

在此模型中,远程系统直接相互通信。每个请求都直接从调用方发送给被调用方,被调用方立即将调用结果返回给调用方。注意:“同步”一词并不指代编程接口的模式。RPC 也支持异步非阻塞调用的编程模式,在这种情况下,调用方仍然期望在指定的时间内从被调用方得到直接响应。
异步通信模型 
在此模型中,子系统之间不是紧密耦合的。调用方只需将请求转换为异步事件(或消息),并将其发送给代理(Agent)。只要消息发送成功,调用即被视为完成。代理将消息传递给下游被调用子系统,并确保任务完成。代理的角色通常由消息中间件承担。
异步通信具有以下优势:
- 系统拓扑简单。由于调用方和被调用方都只与代理通信,系统以星型结构运行,易于维护和管理。
- 上下游耦合度低。弱耦合使系统结构更加灵活。代理执行缓冲和异步恢复。部署在上下游的系统可以独立升级和变更,互不影响。
- 削峰填谷。面向消息的代理通常提供较大的流量缓冲区和强大的流量整形能力,防止流量峰值击垮下游系统。
消息传输模型
消息中间件服务有两种常见的传输模型:点对点模型和发布/订阅模型。
点对点模型 
点对点模型(也称为队列模型)具有以下特点:
消费者匿名性:队列是上下游通信期间使用的唯一身份标识。下游消费者在从队列获取消息时无法声明身份。
一对一通信:消费者没有身份标识。消费者组中的所有消费者共同消费订阅的消息。每条消息只能被一个特定的消费者消费。因此,该模型仅支持一对一通信。
发布/订阅模型 
该模型具有以下特点:
独立消费:在此模型中,消费者使用消费者组或订阅的身份来接收和消费消息。消费者组之间相互独立。
一对多通信:基于独立身份的设计,该模型允许一个 Topic 被多个消费者组订阅,每个消费者组都可以完整访问所有消息。因此,发布/订阅模型支持一对多通信。
传输模型比较
点对点模型的结构更简单,而发布/订阅模型提供了更好的可扩展性。Apache RocketMQ 使用的是发布/订阅模型,并具备同样的高可扩展性。