RocketMQ(一)之基础架构

本文涉及:

目录

Rocket目录

NameServer

NameServer是Apache RocketMQ消息中间件中的一个重要组件,它扮演了一个轻量级的命名服务和路由管理角色。在RocketMQ的分布式系统架构中,NameServer并不存储实际的消息数据,而是集中管理Broker集群的元数据信息。

NameServer启动与初始化:

  1. 启动加载:
    NamesrvStartup 类是NameServer的启动入口,其中的 main 方法启动了整个服务。首先,它会读取并解析命令行参数和配置文件,创建 NamesrvController 对象,这个对象包含了NameServer的核心功能和管理逻辑。

  2. NamesrvController
    NamesrvController是Apache RocketMQ的NameServer中的核心控制器组件,它在整个NameServer的启动、运行及关闭过程中扮演了关键角色。以下是NamesrvController的主要功能和职责:

  • 配置管理:NamesrvController持有NameServer相关的各类配置信息,例如网络通信配置(NettyServerConfig)、NameServer自身的配置(NameServerConfig)等,这些配置决定了NameServer的行为和性能。
  • 元数据管理:管理Broker集群的元数据信息,包括Broker服务器列表、Topic和队列的分布情况等。当Broker向NameServer注册或发送心跳时,NamesrvController会更新和维护这些信息。
  • 服务注册与发现:提供Broker的服务注册接口,并实现服务发现功能。Broker启动时向NameServer注册,NameServer将这些信息存储在内部的数据结构中,以便后续为Producer和Consumer提供路由信息服务。
  • 网络通信服务:初始化和管理基于Netty的网络通信服务,即NettyRemotingServer,负责监听和处理来自Broker或其他客户端的网络请求。
  • 定时任务调度:负责调度和执行定时任务,例如定期清理无效或过期的Broker节点,刷新本地缓存的路由信息等。
  • 资源管理与清理:管理和释放NameServer运行期间所使用的各种资源,包括但不限于网络连接、线程池、定时任务等,在NameServer停止时执行必要的清理工作。

总结来说,NamesrvController是NameServer的核心控制模块,它集成了RocketMQ NameServer的各项关键功能,确保了整个系统的稳定、高效运行。

服务注册与发现机制

  • 当Broker节点启动时,它们会根据配置的NameServer地址列表,逐个向NameServer发起连接,并发送注册请求,其中包括Broker的基本信息,如地址、所属集群、提供的Topic列表等。
  • NameServer接收到Broker的注册信息后,将其保存在内存中,构建出Broker集群的全局视图。
  • Broker会周期性地向NameServer发送心跳以维持活跃状态。如果NameServer在一段时间内未收到某个Broker的心跳,则认为该Broker可能已下线,并在下次定时任务执行时更新其状态。

路由信息管理

  • NameServer维护着Topic到Broker的路由关系表,当Broker注册或更新其Topic信息时,NameServer会更新路由表。
  • 生产者和消费者在生产或消费消息前,会连接到NameServer获取最新的路由信息,从而知道应该与哪些Broker建立连接。
  • NameServer并不持久化这些路由信息,所有的信息都保存在内存中,因此重启NameServer会导致Broker需要重新注册,并重建路由表。不过,由于Broker有自我恢复机制,整个系统能够在短暂波动后迅速恢复正常服务。

Broker

Broker在Apache RocketMQ中扮演着消息中间件的核心角色,它主要负责接收、存储和转发消息,是消息的真正载体。

Broker启动与初始化

  • Broker启动时,首先会从配置文件(如broker.conf)中加载必要的配置项,如Broker的ID、名称、IP地址、监听端口、NameServer地址、存储路径、存储配置(如刷盘策略、内存映射等)、HA配置(主从模式、同步方式)等。
  • 配置加载通常通过类似ConfigManager的类来管理,利用Java Properties或者其他配置工具(如Fastjson)进行解析和装载。

存储模块初始化

  • CommitLog 初始化:Broker会根据配置创建CommitLog文件,用于存储所有消息的原始内容,所有的消息都会按照严格的时间顺序追加写入CommitLog。
  • ConsumeQueue 初始化:每个Topic的每个队列都会有对应的ConsumeQueue,它存储了指向CommitLog物理偏移量的索引,方便Consumer快速定位和消费消息。
  • 索引文件(如有):Broker可能还包括IndexFile等索引结构,用于支持按照消息属性(如Key)进行查询。

网络通信模块初始化

  • Remoting Server 创建:Broker会启动一个Netty服务器,监听来自Producer和Consumer的网络请求,处理消息的发送、拉取、消费确认等操作。
  • Remoting Client 创建:Broker也会作为客户端连接到NameServer,定期发送心跳以注册自己,同时接收NameServer的路由更新信息。

Broker注册到NameServer

  • Broker启动后,会主动连接NameServer,注册自身的元数据信息,包括Broker地址、集群名、Topic信息等。此后,Broker会定期向NameServer发送心跳,以维持活跃状态。

Producer和Consumer接入处理

  • 当Producer和Consumer连接到Broker时,Broker的Netty服务器会创建相应的通道和处理器来处理各种请求,如发送消息、订阅Topic、拉取消息、更新消费进度等。
  • 对于Producer发送的消息,Broker会接收到消息后,将其持久化到CommitLog,并更新相关索引。
  • 对于Consumer的请求,Broker会根据订阅信息和消费模式,从CommitLog和ConsumeQueue中读取消息并返回给Consumer。

Broker集群管理

  • 若Broker部署为主从模式,主Broker不仅要处理消息收发,还需要维护与从Broker的同步逻辑,如主从数据同步、主从切换等。
  • Broker内部还包含了一些管理功能,如维护队列的负载均衡、监控Broker的状态、处理异常情况下的数据迁移等。

通过以上步骤,Broker便完成了从初始化到开始提供服务的全过程。实际源码分析时,可以从Broker的启动类(如BrokerStartup)开始,沿着代码流一步步深入各个关键模块的初始化和运行逻辑。

Producer

RocketMQ 的 Producer 是消息生产者的角色,负责创建和发送消息到 RocketMQ 的 Broker 服务器。Producer 在 RocketMQ 中扮演着消息的源头,通过与 Broker 进行交互,将业务系统产生的数据封装成消息并发送出去。

以下是 RocketMQ Producer 关键特性和功能的概述:

消息发送

Producer 可以通过同步或异步的方式发送消息到 Broker。

  • 同步发送:发送消息后,Producer 会等待 Broker 返回确认结果,然后再继续执行后续操作。
  • 异步发送:发送消息后,Producer 不等待 Broker 确认结果,立即返回,回调函数处理发送结果。

消息类型

  • 普通消息:最基础的消息类型,一旦 Broker 接收到消息,就会尽快尝试推送给消费者。
  • 顺序消息:在一个 Topic 内按照一定的顺序进行消息发送和消费。
  • 事务消息:支持分布式事务处理,确保本地事务和消息发送要么都成功,要么都失败。
  • 延迟消息:消息在特定的时间间隔后才变为可消费状态。
  • 单向消息:仅发送消息而不等待响应,常用于日志收集等场景。

消息构造

Producer 在发送消息前,需要设置消息的主题(Topic)、标签(Tag)、消息体(Body)以及其他属性,如Keys、Headers等。

负载均衡与容错:

  • 当存在多个 Broker 或 Broker 集群时,Producer 可以根据 NameServer 返回的路由信息实现负载均衡,将消息均匀地分散到各个 Broker 上。
  • 如果 Broker 出现故障,Producer 可以通过连接 NameServer 获取新的 Broker 信息,实现故障转移和容错。

批处理:

  • RocketMQ Producer 支持批处理功能,可以一次性发送一组消息,提升消息发送效率。

总结来说,RocketMQ 的 Producer 是消息生产者的重要组件,它负责将业务数据有效、高效、安全地传递给消息中间件,实现业务系统间的解耦和异步处理。

Consumer

Apache RocketMQ中的Consumer(消费者)是消息队列中的一个重要组件,它负责从RocketMQ的Broker拉取或者接收推送的消息,并进行消费处理。

消息订阅:

  • Consumer需要订阅RocketMQ中的一个或多个Topic,只有订阅了的Topic,Consumer才能接收到该Topic下的消息。

消费模式:

  • 广播消费(Broadcasting):每个订阅该Topic的Consumer都会收到所有的消息。
  • 集群消费(Clustering):同组内的Consumer平均分摊消费消息,保证消息仅被消费一次。每个消息都会被投递给该Topic订阅组下的一个Consumer。
  • 顺序消费(Orderly):按照消息发送的顺序进行消费,适用于对消息顺序有严格要求的场景。

拉/推模式:

  • 拉取模式(Pull):Consumer主动从Broker拉取消息进行消费,可以根据自身处理能力灵活控制拉取频率和数量。
  • 推送模式(Push):Broker检测到新消息时,主动将消息推送给Consumer,Consumer被动接收消息。

消费确认(Acknowledge):

  • RocketMQ支持消息消费确认机制,Consumer成功消费消息后需要向Broker发送确认信号,Broker在接收到确认后才会将消息从队列中移除,否则消息会重新投递,确保消息至少被消费一次。

消费组:

  • 同一消费组内的Consumer共享订阅Topic下的消息负载,不同消费组间的消息互不影响。

负载均衡:

  • 在集群消费模式下,RocketMQ内部实现了一套负载均衡算法,可以根据Consumer的负载情况自动分配消息。

重试与死信:

  • 对于消费失败的消息,RocketMQ支持重试机制,超过一定次数仍无法成功消费的消息会被转移到死信队列。

总之,RocketMQ Consumer在消息队列系统中扮演着至关重要的角色,它负责对接收的消息进行处理,并通过各种机制保证消息的可靠消费。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,335评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,895评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,766评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,918评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,042评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,169评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,219评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,976评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,393评论 1 304
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,711评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,876评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,562评论 4 336
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,193评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,903评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,142评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,699评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,764评论 2 351

推荐阅读更多精彩内容