一.简介
RocketMQ 是一个分布式消息中间件,它包含四个主要组件:NameServer、Broker 、Producer和Consumer。
NameServer :(带头大哥)
-
NameServer 类似于轻量级的服务注册与发现中心,扮演着路由管理的角色。
-
它负责维护 Broker 注册的 Topic 信息、队列信息以及 Broker 的地址列表等路由数据。
-
生产者和消费者都需要连接 NameServer 获取路由信息,从而得知应该向哪个 Broker 发送或订阅消息。
Broker :(小弟-干活的)
-
Broker 是 RocketMQ 的核心服务,它负责接收、存储和转发消息。
-
Broker 分为主从节点,支持多副本机制,提供高可用和高并发的消息处理能力。
-
Broker 会定时向 NameServer 注册自己的路由信息,并处理来自生产者的消息发布请求以及来自消费者的订阅和消息拉取请求。
Producer:
-
Producer 是消息的生产者,负责创建并发送消息到 Broker。
-
Producer 会首先从 NameServer 获取 Topic 的路由信息,然后选择合适的 Broker 进行消息投递。
-
支持分布式集群部署和负载均衡,能够进行消息的批量发送、顺序发送、延时发送等多种消息发送模式。
Consumer:
-
Consumer 是消息的消费者,它订阅特定的 Topic 并从 Broker 拉取消息进行处理。
-
Consumer 也会连接 NameServer 获取 Topic 的路由信息,进而找到并连接相关的 Broker 以拉取消息。
-
Consumer 支持集群消费模式,包括广播消费、集群消费、有序消息消费等多种消费模式。
二.在 RocketMQ 中,Topic、Queue和Group 是三个非常重要的概念。
1. Topic(主题)
Topic 是消息发布和订阅的逻辑标识符(抽象-消息的归类),所有消息都必须发布到特定的 Topic 中,然后才能被订阅者消费。
-
生产者(Producer)发布消息时,会选择一个特定的 Topic,所有的消息都会按照这个 Topic 进入对应的队列。
-
消费者(Consumer)订阅的是一个或多个 Topic,表示他们希望消费这个 Topic 下的所有消息。
-
多个生产者可以向同一个 Topic 发布消息,同样,多个消费者也可以订阅同一个 Topic。
2.Queue(消息队列)
一开始的时候一个Topic就对应一个queue,多好,一个是名字、一个是实现。可是用着用着就悲催了,为啥?消息操作太多了,全都怼在一个小队列上。为了提高效率,咋整??RocketMQ是这样做的,一个Topic绑定的是一组queue,这样每个queue分摊部分压力,性能就上去了。
-
Queue 是 Topic 下物理层面的进一步划分,代表了消息的实际存储位置和消费顺序。
-
在 RocketMQ 中,每个 Topic 会被拆分成多个Queue,这些 Queue 是分布式的,可以存在于不同的 Broker 节点上。
-
生产者在发布消息时,消息会被均匀地分布到 Topic 关联的所有 Queue 上,这样可以实现水平扩展和负载均衡。
-
消费者在消费消息时,可以选择从 Topic 下的一个或多个Queue 中消费消息,以此实现并行消费和分布式处理,提高消息消费的效率和系统的吞吐量。
简而言之,Topic 是逻辑上的抽象,用于标识一类消息,而 Queue 是 Topic 在物理层面的具体实现,用于承载实际的消息,并决定了消息的存储和消费顺序。两者结合起来,使得RocketMQ能够高效地进行消息的发布和订阅。
3. Group(组)
Group 是生产者和消费者的一个逻辑标识符,每个生产者和消费者都必须属于某一个 Group。RocketMQ 使用 Group 来区分不同的消费者和生产者,以便进行负载均衡、容错和协作。同一 Group 中的消费者将共同 消费同一个 Topic 中的消息。在 RocketMQ 中,一个组可以有多个消费者实例,每个实例将独立消费一部分消息。这样设计的好处在于可以通过增加实例数来扩容和提高消费速度。
每个组都会拿到topic的所有消息,同一组内如果有多个消费者实例,那么它们平均拿取消息。