角色
- NameServer:这是一个无状态的服务注册与发现节点,主要负责提供服务注册、服务发现、路由管理等功能。NameServer集群中的每个节点都是平等的,它们之间不直接通信。其他组件如Broker、Producer、Consumer等需要定期向NameServer上报自己的状态,以便进行服务发现。
- Broker:这是RocketMQ的核心组件,负责接收来自Producer的消息、存储消息以及将消息转发给Consumer。Broker可以配置为Master或Slave模式来实现高可用性。Master可以处理读写请求,而Slave通常只处理读请求,用于数据备份。一个Master可以对应多个Slave,通过相同的BrokerName和不同的BrokerId(0表示Master,非0表示Slave)来标识它们之间的关系。
- Producer:即消息生产者,负责生成并发送消息到Broker。Producer在发送消息前需要先通过NameServer获取目标Topic的路由信息,然后与对应的Broker建立连接发送消息。
- Consumer:即消息消费者,负责从Broker拉取并消费消息。Consumer同样需要先通过NameServer获取Topic的路由信息,然后连接到相应的Broker上消费消息。根据消费方式的不同,Consumer可以分为点对点(队列模式)和发布/订阅(主题模式)两种类型。
通俗理解就是
NameServer:商场的导购台---- 导购台指引供货商/消费用户去查找指定商铺的位置
Broker:商铺---- 负责接收供货商的商品以及销售商品至消费客户
Producer:供货商---- 负责将东西送到商铺
Consumer:消费客户---- 负责去指定的商铺消费
为了让生产者和消费者能够将自己的东西/买到自己需要的指定物品
rocketMQ提供了两个属性
Topic和tag用于区分不同性质的信息
属性
1. Topic(主题)-- 必须指定
- 定义:Topic 是消息的主题,用于对消息进行分类。每个消息都 必须 属于一个特定的 Topic。
- 作用:Topic 是消息分类的基本单位,生产者发送消息时需要指定一个 Topic,消费者订阅消息时也必须指定一个或多个 Topic。
- 示例:假设有一个电商系统,可以有多个 Topic,例如
OrderTopic
用于处理订单消息,PaymentTopic
用于处理支付消息。
2. Tag(标签)-- 可选,不一定要指定
- 定义:Tag 是对同一 Topic 下的消息进行进一步细分的标识。一个 Topic 可以有多个 Tag,每个消息可以携带一个或多个 Tag。
- 作用:Tag 用于在同一个 Topic 内对消息进行更细粒度的分类,使得消费者可以根据具体的业务需求订阅感兴趣的消息子集。
- 示例:在
OrderTopic
下,可以有多个 Tag,例如NewOrder
表示新订单,CancelledOrder
表示已取消的订单。
通俗理解就是
Topic:店名--- 小米,华为,苹果等
Tag:商品种类--- 手机,手表,电脑等
运行原理
RocketMQ 运行原理概述
RocketMQ 是一个高性能、高可靠、高实时的消息中间件,主要用于在分布式系统中实现消息的异步传递。它的核心组件包括 NameServer、Broker、Producer 和 Consumer。下面是这些组件的工作原理和交互过程:
- NameServer(信息咨询台)
-
- 作用:负责管理和调度消息的路由信息,提供服务注册与发现。
- 类比:商场的信息咨询台,提供店铺位置和商品信息。
- Broker(店铺)
-
- 作用:负责接收和存储消息,以及将消息分发给消费者。
- 类比:商场内的店铺,接收和存储商品,供顾客购买。
- Producer(供货商)
-
- 作用:生成和发送消息到 Broker。
- 类比:供货商,将商品送到商场内的店铺。
- Consumer(顾客)
-
- 作用:从 Broker 拉取消息并处理。
- 类比:顾客,到店铺购买商品。
以商场为主题的运行原理
1. 初始化阶段
- NameServer 启动:信息咨询台开始工作,等待店铺(Broker)和服务商(Producer)、顾客(Consumer)的注册和查询。
- Broker 启动:店铺启动后,向信息咨询台(NameServer)注册自己的信息,包括店铺名称、位置等。
2. 消息生产阶段
- Producer 启动:供货商启动后,向信息咨询台(NameServer)查询目标店铺(Broker)的位置信息。
- 发送消息:供货商将商品(消息)送到指定的店铺(Broker)。例如,供货商将一批男装送到
服装店
,并标明这批商品的标签为男装
。
3. 消息存储阶段
- Broker 存储消息:店铺(Broker)接收并存储供货商送来的商品(消息),并根据标签将商品分类存放。
4. 消息消费阶段
- Consumer 启动:顾客启动后,向信息咨询台(NameServer)查询目标店铺(Broker)的位置信息。
- 订阅消息:顾客订阅感兴趣的店铺和商品标签。例如,顾客 A 订阅
服装店
的男装
标签。 - 拉取消息:顾客从店铺(Broker)拉取并购买商品(消息)。例如,顾客 A 去
服装店
购买标签为男装
的商品。
原理图展示
下面是 RocketMQ 运行原理的简化图,以商场为主题:
详细步骤
- NameServer 启动:
-
- 名称:信息咨询台
- 功能:提供店铺位置和商品信息
- Broker 启动:
-
- 名称:店铺
- 功能:接收和存储商品,供顾客购买
- 操作:向信息咨询台注册自己的信息
- Producer 启动:
-
- 名称:供货商
- 功能:将商品送到店铺
- 操作:向信息咨询台查询目标店铺的位置信息,将商品送到指定的店铺
- 消息存储:
-
- 名称:店铺
- 功能:接收并存储商品
- 操作:根据标签将商品分类存放
- Consumer 启动:
-
- 名称:顾客
- 功能:从店铺购买商品
- 操作:向信息咨询台查询目标店铺的位置信息,订阅感兴趣的店铺和商品标签
- 消息消费:
-
- 名称:顾客
- 功能:从店铺拉取并购买商品
- 操作:从店铺拉取标签为男装的商品
故障场景分析
可能发生的场景及解决方案
场景一:商场关门了(Broker 停机)
问题描述:在消息传递过程中,如果 Broker 因为某种原因停机(如服务器宕机、网络故障等),会导致消息无法正常接收和发送。
解决方案:
- 高可用性配置:设置 Master-Slave 模式,即一个 Master Broker 和多个 Slave Broker。Master 负责读写操作,Slave 负责备份数据。如果 Master 停机,Slave 可以接管,确保服务不中断。
- 自动恢复:Broker 停机后,一旦恢复,可以自动重新加入集群,继续处理未完成的消息。
- 消息持久化:将消息持久化到磁盘,确保即使 Broker 停机,消息也不会丢失。
场景二:供货商停止送货(Producer 停止发送消息)
问题描述:如果生产者因某种原因停止发送消息(如程序崩溃、网络故障等),会导致消息生产中断。
解决方案:
- 重试机制:生产者可以在发送消息失败后进行重试,直到消息成功发送。
- 心跳检测:生产者定期向 NameServer 发送心跳,确保自身状态正常。
- 多实例部署:部署多个生产者实例,增加系统的冗余性和可靠性。
场景三:顾客离开商场(Consumer 停止消费消息)
问题描述:如果消费者因某种原因停止消费消息(如程序崩溃、网络故障等),会导致消息积压。
解决方案:
- 重试机制:消费者在消费消息失败后可以进行重试,直到消息成功处理。
- 消息重投递:Broker 可以将未成功处理的消息重新投递给其他消费者。
- 多实例部署:部署多个消费者实例,增加系统的处理能力和可靠性。
- 消息确认机制:消费者在成功处理消息后发送确认回执,Broker 收到确认后才删除消息。如果未收到确认,Broker 会重新投递消息。
场景四:信息咨询台故障(NameServer 故障)
问题描述:如果 NameServer 因某种原因故障,会导致生产者和消费者无法获取路由信息,影响消息的发送和接收。
解决方案:
- 集群部署:NameServer 采用集群部署,每个节点都是无状态的,可以互相备份。如果一个节点故障,其他节点可以继续提供服务。
- 自动切换:生产者和消费者在启动时会缓存路由信息,即使 NameServer 故障,也可以暂时继续工作,直到 NameServer 恢复。
图解
为了更直观地展示这些场景和解决方案,我们可以通过图解来表示: