领域模型
https://rocketmq.apache.org/zh/docs/domainModel/01main/
概述
Apache RocketMQ 是一款典型的分布式架构下的中间件产品,使用异步通信方式和发布订阅的消息传输模型。
通信方式和传输模型的具体说明,请参见下文通信方式介绍和消息传输模型介绍。
Apache RocketMQ 产品具备异步通信的优势,系统拓扑简单、上下游耦合较弱;
主要应用于异步解耦,流量削峰填谷等场景。
Apache RocketMQ 中消息的生命周期主要分为消息生产、消息存储、消息消费这三部分:
生产者生产消息并发送至 Apache RocketMQ 服务端,消息被存储在服务端的主题中,消费者通过订阅主题消费消息;
通信方式介绍
分布式系统架构思想下,将复杂系统拆分为多个独立的子模块,例如微服务模块。
此时就需要考虑子模块间的远程通信,典型的通信模式分为以下两种,一种是同步的RPC远程调用;一种是基于中间件代理的异步通信方式。
同步RPC调用模型下,不同系统之间直接进行调用通信,每个请求直接从调用方发送到被调用方,然后要求被调用方立即返回响应结果给调用方,以确定本次调用结果是否成功。
注意 此处的同步并不代表RPC的编程接口方式,RPC也可以有异步非阻塞调用的编程方式,但本质上仍然是需要在指定时间内得到目标端的直接响应。
异步消息通信模式下,各子系统之间无需强耦合直接连接,调用方只需要将请求转化成异步事件(消息)发送给中间代理,发送成功即可认为该异步链路调用完成,剩下的工作中间代理会负责将事件可靠通知到下游的调用系统,确保任务执行完成。
该中间代理一般就是消息中间件。
异步通信的优势如下:
- 系统拓扑简单。由于调用方和被调用方统一和中间代理通信,系统是星型结构,易于维护和管理。
- 上下游耦合性弱。上下游系统之间弱耦合,结构更灵活,由中间代理负责缓冲和异步恢复。 上下游系统间可以独立升级和变更,不会互相影响。
- 容量削峰填谷。基于消息的中间代理往往具备很强的流量缓冲和整形能力,业务流量高峰到来时不会击垮下游。
消息传输模型
主流的消息中间件的传输模型主要为点对点模型和发布订阅模型;
Topic
https://rocketmq.apache.org/zh/docs/domainModel/02topic/
定义
主题是 Apache RocketMQ 中消息传输和存储的顶层容器,用于标识同一类业务逻辑的消息;
模型关系
主题是 Apache RocketMQ 的顶层存储,所有消息资源的定义都在主题内部完成,但主题是一个逻辑概念,并不是实际的消息容器。
主题内部由多个队列组成,消息的存储和水平扩展能力最终是由队列实现的;并且针对主题的所有约束和属性设置,最终也是通过主题内部的队列来实现。
队列
https://rocketmq.apache.org/zh/docs/domainModel/03messagequeue/
定义
队列是 Apache RocketMQ 中消息存储和传输的实际容器,也是 Apache RocketMQ 消息的最小存储单元。
Apache RocketMQ 的所有主题都是由多个队列组成,以此实现队列数量的水平拆分和队列内部的流式存储;
队列的主要作用如下:
-
存储顺序性
队列天然具备顺序性,即消息按照进入队列的顺序写入存储,同一队列间的消息天然存在顺序关系,队列头部为最早写入的消息,队列尾部为最新写入的消息。消息在队列中的位置和消息之间的顺序通过位点(Offset)进行标记管理;
-
流式操作语义
Apache RocketMQ 基于队列的存储模型可确保 消息从任意位点读取任意数量的消息,以此实现类似聚合读取、回溯读取等特性,这些特性是RabbitMQ、ActiveMQ等非队列存储模型不具备的。
模型关系
Apache RocketMQ 默认提供消息可靠存储机制,所有发送成功的消息都被持久化存储到队列中,配合生产者和消费者客户端的调用可实现至少投递一次的可靠性语义。
在 Apache RocketMQ 消息收发模型中,队列属于主题的一部分,虽然所有的消息资源以主题粒度管理,但实际的操作实现是面向队列。
例如,生产者指定某个主题,向主题内发送消息,但实际消息发送到该主题下的某个队列中。
Apache RocketMQ 中通过修改队列数量,以此实现横向的水平扩容和缩容。
消息
https://rocketmq.apache.org/zh/docs/domainModel/04message/
定义
消息是 Apache RocketMQ 中的最小数据传输单元。
生产者将业务数据的负载和拓展属性包装成消息发送到 Apache RocketMQ 服务端,服务端按照相关语义将消息投递到消费端进行消费。
Apache RocketMQ 的消息模型具备如下特点:
-
消息不可变性
消息本质上是已经产生并确定的事件,一旦产生后,消息的内容不会发生改变。即使经过传输链路的控制也不会发生变化,消费端获取的消息都是只读消息视图。
-
消息持久化
Apache RocketMQ 会默认对消息进行持久化,即将接收到的消息存储到 Apache RocketMQ 服务端的存储文件中,保证消息的可回溯性和系统故障场景下的可恢复性。
生产者
https://rocketmq.apache.org/zh/docs/domainModel/04producer/
定义
生产者和主题的关系为多对多关系,即同一个生产者可以向多个主题发送消息,对于平台类场景如果需要发送消息到多个主题,并不需要创建多个生产者;
同一个主题也可以接收多个生产者的消息,以此可以实现生产者性能的水平扩展和容灾。
内部属性
消息发送重试:
https://rocketmq.apache.org/zh/docs/featureBehavior/05sendretrypolicy/
消费者分组(ConsumerGroup)
https://rocketmq.apache.org/zh/docs/domainModel/07consumergroup/
定义
消费者分组是 Apache RocketMQ 系统中 承载多个消费行为一致的消费者的负载均衡分组。
和消费者不同,消费者分组并不是运行实体,而是一个逻辑资源。
在 Apache RocketMQ 中,通过消费者分组内初始化多个消费者实现 消费性能的 水平扩展以及高可用容灾。
在消费者分组中,统一定义以下消费行为,同一分组下的多个消费者 将按照分组内 统一的消费行为和负载均衡策略消费消息。
-
订阅关系:Apache RocketMQ 以消费者分组的粒度 管理订阅关系,实现订阅关系的管理和追溯。具体信息,请参见订阅关系(Subscription)。
-
投递顺序性:Apache RocketMQ 的服务端将消息投递给消费者消费时,支持顺序投递和并发投递,投递方式在消费者分组中统一配置。具体信息,请参见顺序消息。
-
消费重试策略: 消费者消费消息失败时的重试策略,包括重试次数、死信队列设置等。具体信息,请参见消费重试。
https://rocketmq.apache.org/zh/docs/featureBehavior/10consumerretrypolicy/
消费者(Consumer)
https://rocketmq.apache.org/zh/docs/domainModel/08consumer/
消费者分类
https://rocketmq.apache.org/zh/docs/featureBehavior/06consumertype/
标签:存储,调用,队列,消息,Apache,RocketMQ From: https://www.cnblogs.com/anpeiyong/p/17988716