RocketMQ消息队列(下)

时间:2024-02-17 10:37:04

RocketMQ 基本概念

RocketMQ主要有四大核心组成部分:NameServer、Broker、Producer以及Consumer 四部分。这些角色通常以集群的方式存在,RocketMQ 基于纯Java开发,具有高吞吐量、高可用性、适合大规模分布式系统应用的特点。

对于RocketMQ 而言,我们想要启动,必须首先启动 NameServer,在启动 Broker主机, Broker 会向 NameServer 注册对应的路由和服务(Broker 地址、主体和),Producer会进行路由的发现,向NameServer请求Broker路由信息,进行消息的发送。

作为Consumer要连通NameServer,获取到相关的路由信息,方便我们进行消息的订阅。

Broker 也是一个很重要的角色,主要负责消息的存储,不管是生产消息还是订阅消息,消息的来源都是 Broker,一般来说消息的发送(Producer)只会发到主节点,然后Broker会进行消息的同步,同步到从节点,作为消费者(Consumer)也只会优先从Master节点,获取消息,进行消费,除非主节点不可用或者非常繁忙,才会从从节点进行消费,Broker除了消息的中转,还负责消息的持久化以及主从数据之间的复制

NameServer:

NameServer是一个服务与注册的发现中心。也是整个 RocketMQ 的“大脑”,所以 RocketMQ 需要先启动 NameServer再启动 RocketMQ 中的 Broker

NameServer 是一个几乎无状态节点,可集群部署,节点之间无任何信息同步。NameServer底层由 Netty 实现,是内存式存储,所以 NameServer中的 broker、topic不会持久化。

NameServer 其角色类似Dubbo和zookeeper,主要负责Broker的动态注册与发现。

为什么不使用zookeeper?

rocketmq主要是在分布式情况下使用追求性能,因为zookeeper最求最终一致性,所以在性能上会有所折扣。

Broker:

消息服务器(Broker)是消息存储中心,主要作用是接收来自 Producer的消息并存储,Consumer 从这里取得消息。存储与消息相关的元数据,包括用户组、消费进度偏移量、队列信息等。从部署结构图中可以看出 Broker有Master和Slave两种类型, Master 既可以写又可以读,Slave 不可以写只可以读。

Producer:

Producer也称为消息发布者(生产者),负责生产并发送消息至Topic。生产者向Broker发送由业务应用程序系统生成的消息。rocketmq提供了发送:同步、异步和单向(one-way)的多种范例。

Consumer:

也称为消息订阅者,负责从 Topic 接收并消费消息。消费者从 Broker那里拉取信息并将其输入应用程序。从Master拿到消息,执行完成后,会发送一个消息给Broker进行确认,这个就是ACK确认

分组(Group)

Group 分为两个部分 生产者和消费者

  • 生产者: 表示发送同一类消息的 Producer,通常情况下发送逻辑是一致的。发送普通消息时,用于标识使用,没有特别的用处。
    主要用来作用于事务消息,当事务消息中某条消息一直处于等待状态并超时,Broker会回查同一个Group下的其他producer,确定该消息是 commit 还是 rollback
  • 消费者: 消费者的分组就非常有意义了,消费者是标识一类 Consumer的集合名称,这类 Consumer通常消费一类消息,且消费逻辑一致。同一个 Consumer Group下的各个实例将共同消费 topic 的消息,起到负载均衡的作用。
    消费进度以Consumer Group为粒度管理,不同 Consumer Group 之间消费进度彼此不受影响,即消息 A 被Consumer Group1 消费过,也会再给Consumer Group2 消费。

主体(Topic)

用来区分消息的种类,表示一类消息的逻辑名字,消息的逻辑管理单位,无论生产还是消费消息,都需要执行Topic。

一个发送者可以发送消息给一个或者多个Topic;

一个消息接受者可以订阅一个或多个Topic消息;

 

消息队列(Message Queue)

消息队列 简称 Queue ,消息物理管理单位。用来并行发送和接收消息,相当于是Topic的分区。

一个Topic会有若干个Queue,消息的生产一般会比消息消费的速度要快,消息进行消费的时会有对应的业务逻辑进行处理,这个时候就会降低消息消费的速度。所有一般Topic会有若干个Queue。主要用来解决生产很快,消费很慢。

如果同一个Topic创建在不同的Broker,那么不同的Broker有不同的Queue,将物理存储在不同的Broker节点之上,具有水平扩展的能力。无论是生产者还是消费者,实际的操作都是针对Queue级别。

标签(Tag)

RocketMQ 支持在发送时给 topic 的消息设置 tag,用于同一主题下区分不同类型的消息。

来自同一业务单元的消息,可以根据不同业务目的在同一主题下设置不同标签。比如有一个 Topic 消息为水果,那么水果可以有其他的标签 可以是 香蕉、西瓜、草莓等等,我们可以把对应的消息,打上对应的标签(Tag),这个就是方便我们在消费的时候做对应的筛选。

标签能够有效地保持代码的清晰度和连贯性,并优化 RocketMQ 提供的查询系统。消费者可以根据Tag实现对不同子主题的不同消费逻辑,实现更好的扩展性。