一、基本概念
消息(Message)
消息(Message)就是要传输的信息。一条消息必须有一个主题(Topic),主题可以看做是你的信件要邮寄的地址。
主题(Topic)
Topic表示一类消息的集合,每个主题包含若干条消息,每条消息只能属于一个主题。一个生产者可以同时发送多种Topic消息,而一个消费者只能对某种特定的Topic感兴趣,即只可以订阅和消息一种Topic的消息。
topic :message 1:n
message :topic 1:1
producer :topic 1 :n
consumer:topic 1:1

标签(Tag)
标签(Tag)可以看作子主题,它是消息的第二级类型,用于为用户提供额外的灵活性。使用标签,同一业务模块不同目的的消息就可以用相同 Topic 而不同的 Tag 来标识。
比如交易消息又可以分为:交易创建消息、交易完成消息等,一条消息可以没有 Tag 。标签有助于保持您的代码干净和连贯,并且还可以为 RocketMQ 提供的查询系统提供帮助。
简单来说TOPIC可以看作衣服,而TAG可以看作衣服下的【短袖】、【外套】、【卫衣】等
队列(Queue)
存储消息的物理实体。一个Topic中可以包含多个Queue,每个Queue中存放的就是该Topic的消息。一个Topic的Queue也被称为一个Topic中的消息的分区。
一个Topic的Queue中的消息只能被一个消费者组中的一个消费者消费。一个Queue中的消息不允许同一个消费者组中的多个消费者同时消费。


二、系统架构

Producer
就是消息生产者,可以集群部署。它会先和 NameServer 集群中的随机一台建立长连接,得知当前要发送的 Topic 存在哪台 Broker Master上,然后再与其建立长连接,支持多种负载平衡模式发送消息。
Consumer
消息消费者,也可以集群部署。它也会先和 NameServer 集群中的随机一台建立长连接,得知当前要消息的 Topic 存在哪台 Broker Master、Slave上,然后它们建立长连接,支持集群消费和广播消费消息。
Broker
主要负责消息的存储、查询消费,支持主从部署,一个 Master 可以对应多个 Slave,Master 支持读写,Slave 只支持读。Broker 会向集群中的每一台 NameServer 注册自己的路由信息。

Remoting Module:整个Broker的实体,负责处理来自clients端的请求。
Client Manager:客户端管理器。负责接收、解析客户端(Producer/Consumer)请求,管理客户端。
Store Server:存储服务、提供方便简单的API接口,处理消息存储到物理硬盘和消息查询功能。
HA Server:高可用服务。提供Master Broker和Slave Broker之间的数据同步功能。
Index Server:索引服务。根据特定的Message key,对投递到Broker的消息进行索引服务,同时也提供根据Message Key对消息进行快速查询的功能。
NameServer
是一个很简单的 Topic 路由注册中心,支持 Broker 的动态注册和发现,保存 Topic 和 Borker 之间的关系。通常也是集群部署,但是各 NameServer 之间不会互相通信, 各 NameServer 都有完整的路由信息,即无状态。
路由注册
那各节点中的数据是如何进行数据同步的? 在Broker节点启动时,轮询NameServer列表,与每个NaemServer节点建立长连接,发起注册请求。在NameServer内部维护着一个Broker列表,用来动态存储Broker的信息。Broker节点为了证明自己是活着,为了维护与NameServer间的长连接,会将最新的信息以心跳包的方式上报给NameServer,每30秒发送一次心跳。心跳包中包含BrokerId、Broker地址、Broker名称、Broker所属集群名称等等。NameServer在接收到心跳包后,会更新心跳时间戳,记录这个Broker的最新存活时间。
主要功能
Broker管理:接受Broker集群的注册信息并且保存下来作为路由信息的基本数据;提供心跳检测机制,检查Broker是否还存活。
路由信息管理:每个NameServer中都保存着Broker集群的整个路由信息和用于客户端查询的队列信息。Producer和Consumer通过NameServer可以获取整个Broker集群的路由信息,从而进行消息的投递和消费。
交互过程
先启动 NameServer 集群,各 NameServer 之间无任何数据交互,Broker 启动之后会向所有 NameServer 定期(每 30s)发送心跳包,包括:IP、Port、TopicInfo,NameServer 会定期扫描 Broker 存活列表,如果超过 120s 没有心跳则移除此 Broker 相关信息,代表下线。
这样每个 NameServer 就知道集群所有 Broker 的相关信息,此时 Producer 上线从 NameServer 就可以得知它要发送的某 Topic 消息在哪个 Broker 上,和对应的 Broker (Master 角色的)建立长连接,发送消息。
Consumer 上线也可以从 NameServer 得知它所要接收的 Topic 是哪个 Broker ,和对应的 Master、Slave 建立连接,接收消息。
路由剔除
由于Broker关机、宕机或网络抖动等原因,NameServer没有收到Broker心跳,NameServer可能会将其从Broker列表中剔除。
NameServer中有一个定时任务,每隔10秒应付扫描一次Broker表,查看每一个Broker的最新心跳时间戳距离当前时间是否超过120秒,如果超过,则会判定Broker失效,然后将其从Broker列表中剔除。
路由发现
RocketMQ的路由发现采用的是Pull模型。当Topic路由信息出现变化时,NameServer不会主动推送给客户端,而是客户端定时拉取主题最新的路由。默认客户端每30秒会拉取一次最新的路由。
- Pull模型:拉取模型。存在的问题:实时性较差。
- Push模型:推送模型。其实时性较好,是一个“发布-订阅”模型,需要维护一个长连接。而长连接的维护需要资源成本。(该模型适合于实时性要求较高,Client数量不多,Server数据变化较频繁)
- Long Polling:长轮询模型。其实是对Push与Pull模型的整合,充分利用了这两种模型的优势,屏蔽了它们的劣势。
工作流程
- 启动
NameServer,NameServer启动后开始监听端口,等待Broker、

RocketMQ是一个分布式消息中间件,本文详细介绍了其基本概念,如消息、主题、标签和队列,以及系统架构中的生产者、消费者和Broker的角色。消息通过Topic和Tag进行分类,Queue作为存储实体。NameServer作为路由注册中心,负责Broker的注册和发现。Producer和Consumer通过NameServer获取路由信息,建立与Broker的连接进行消息的发送和接收。RocketMQ支持集群和广播消费模式,提供数据复制与刷盘策略,保证高可用性和数据一致性。此外,文章还阐述了消息的存储机制,包括CommitLog、ConsumeQueue和索引文件,以及消息的生产和消费流程。
最低0.47元/天 解锁文章
1320

被折叠的 条评论
为什么被折叠?



