RocketMQ详解(三)启动运行原理
专题目录
引子
明白一个项目启动时做了什么,更有利于理解整体运行原理。本节我们从rocketmq启动流程,来探究运行原理。总体流程如下:

如上图所示,rocketMQ启动顺序:nameserver->broker->producer->consumer。下面我们从4个模块细化启动流程。
一、nameserver启动原理

如上图所示,nameServer名字服务作为rocketMQ的基于Topic路由的注册中心,支持Broker的动态注册与发现,nameServer启动流程如下:
- 加载kv配置。
- 构建NettyRemotingServer初始化netty通信实例。
- 初始化远程通信执行器。
- 注册请求执行器。
- 定时轮训清除宕机的broker。
- 注册SSL证书变化监听器。
- 启动远程通信服务端(netty)。
- 启动SSL证书监听服务。
其中,1-6步是初始化过程,7-8是启动流程。
二、broker启动原理
broker作为消息代理服务器,用于接收并存储消息,等待被消费者拉取消费。broker启动分两大部分:
- 初始化:构造createBrokerController-》初始化controller.initialize()
- 启动:controller.start()
如下图:

2.1 broker初始化流程
- 载入各种配置文件(topic配置、消费偏移量、订阅群组、消费过滤)。
- 初始化DefaultMessageStore消息存储器,并load:载入CommitLog、ConsumeQueue、载入索引文件。
- 构造NettyRemotingServer netty远程通信服务器(普通+vip)、9种执行器(sendMessageExecutor、pullMessageExecutor、replyMessageExecutor、queryMessageExecutor、adminBrokerExecutor、clientManageExecutor、heartbeatExecutor、endTransactionExecutor、consumerManageExecutor)
- registerProcessor():注册处理器(使用上面9个执行器,分别注册到普通远程通信服务器、VIP远程通信服务器)具体通信机制见 RocketMQ详解(三)核心设计原理。
- 初始化定时任务:BrokerStats当天数据统计、每5S持久化一次消费Offset、每10s持久化一次消费者filter、每3分钟执行一次broker保护(默认不执行)、每1s打印水位日志(线程池待处理队列)、每1分钟打印commitLog分发滞后bytes、每2分钟(请求http://jmenv.tbsite.net:8080/rocketmq/nsaddr)拉取一次nameserver地址、主节点每1分钟(开启DLeger主从切换)打印从滞后主offset。
- 注册SSL证书变化监听器。
- 初始化事务相关服务、监听器。
- 初始化AccessValidator
- 初始化RPC请求钩子RPCHook(远程通信服务端+VIP远程通信服务端),包含doBeforeRequest请求前、doAfterResponse请求后2个方法。
2.2 broker启动流程

- messageStore启动消息存储服务:把生产者发送的消息commitLog转存为consumerQueue逻辑消费队列+indexFile索引文件,分别用于消费者消费消息+根据key查询消息。
- remotingServer.start():启动远程通信服务端(netty)
- fastRemotingServer.start():启动VIP远程通信服务端(netty)
- 注册SSL证书变化监听器。
- brokerOuterAPI.start():remotingClient.start()启动OuterAPI专用远程通信客户端。
- pullRequestHoldService.start():开启请求长轮训服务,默认LongPolling=5S,5S后,执行消息写入。
- clientHousekeepingService.start():启动netty客户端探活服务(生产者、消费者、过滤器),定时10s执行一次,超时2分钟,移除channel。
- filterServerManager.start():启动过滤服务。
- 定时任务:每30s向nameserver注册所有broker。
- brokerFastFailure.start():启动快速失败,每10ms,清除过期请求。( sendThreadPoolQueue、pullThreadPoolQueue、heartbeatThreadPoolQueue、endTransactionThreadPoolQueue)
三、producer启动原理

如上图,生产者作为消息发送方,producer启动流程如下:
- checkConfig()校验配置
- MQClientInstance创建客户端实例。
- registerProducer向broker注册生产者。
- MQClientInstance.start()启动客户端实例。
- 服务状态更新为RUNNING。
- 获取nameserver地址。
- remotingClient.start():启动netty远程客户端。
- startScheduledTask():开启定时任务。
- pullMessageService.start() :开启守护线程,执行拉取消息
- rebalanceService.start():启动负载均衡器
- DefaultMQProducerImpl().start():启动消息生产者
- 客户端实例状态更新为RUNNING
- 1)延迟10ms后,获取每2分钟更新一次nameserver地址
- 2)延迟10ms后,每30s去nameserver获取最新topic路由
- 3)延迟1s后,每30s移除一次下线的broker+给所有broker发送心跳(版本号)
- 4)延迟10s后,每5s持久化“消费offset”到broker/本地。
- 5)延迟1ms后,每1分钟,根据待消息数,动态调整消费者线程池核心数。(被阉割,目前是空)
四、consumer启动原理
消费者启动流程,见第三节的图。
消费者启动流程如下:
- checkConfig():校验配置
- copySubscription:复制订阅信息
- MQClientInstance:创建客户端实例
- rebalanceImpl:创建消费端负载均衡
- pullAPIWrapper:创建pull请求包装器
- offsetStore初始化偏移量:广播模式:client存储;集群模式:broker存储
- consumeMessageService.start():初始化消费消息服务,并启动。1.并发消费:延迟15m后,每过15分钟清理一次超时未处理完消息 2.顺序消息:延迟1s后,每20s锁一次broker中mq队列+消费者端ProcessQueue
- registerConsumer:向broker注册消费者。
- MQClientInstance.start():启动客户端实例
- 服务状态更新为:RUNNING
RocketMQ详解(三)启动运行原理的更多相关文章
- RocketMQ详解(一)原理概览
专题目录 RocketMQ详解(一)原理概览 RocketMQ详解(二)安装使用详解 RocketMQ详解(三)启动运行原理 RocketMQ详解(四)核心设计原理 RocketMQ详解(五)总结提高 ...
- Activity详解三 启动activity并返回结果
首先看演示: 1 简介 .如果想在Activity中得到新打开Activity 关闭后返回的数据,需要使用系统提供的startActivityForResult(Intent intent, int ...
- Activity详解三 启动activity并返回结果 转载 https://www.cnblogs.com/androidWuYou/p/5886991.html
首先看演示: 1 简介 .如果想在Activity中得到新打开Activity 关闭后返回的数据,需要使用系统提供的startActivityForResult(Intent intent, int ...
- RocketMQ详解(四)核心设计原理
专题目录 RocketMQ详解(一)原理概览 RocketMQ详解(二)安装使用详解 RocketMQ详解(三)启动运行原理 RocketMQ详解(四)核心设计原理 RocketMQ详解(五)总结提高 ...
- RocketMQ详解(二)安装使用详解
专题目录 RocketMQ详解(一)原理概览 RocketMQ详解(二)安装使用详解 RocketMQ详解(三)启动运行原理 RocketMQ详解(四)核心设计原理 RocketMQ详解(五)总结提高 ...
- 淘宝JAVA中间件Diamond详解(2)-原理介绍
淘宝JAVA中间件Diamond详解(二)---原理介绍 大家好,通过第一篇的快速使用,大家已经对diamond有了一个基本的了解.本次为大家带来的是diamond核心原理的介绍,主要包括server ...
- [转帖]万字详解Oracle架构、原理、进程,学会世间再无复杂架构
万字详解Oracle架构.原理.进程,学会世间再无复杂架构 http://www.itpub.net/2019/04/24/1694/ 里面的图特别好 数据和云 2019-04-24 09:11:59 ...
- 转:Windows下的PHP开发环境搭建——PHP线程安全与非线程安全、Apache版本选择,及详解五种运行模式。
原文来自于:http://www.ituring.com.cn/article/128439 Windows下的PHP开发环境搭建——PHP线程安全与非线程安全.Apache版本选择,及详解五种运行模 ...
- Android 之窗口小部件详解(三) 部分转载
原文地址:http://blog.csdn.net/iefreer/article/details/4626274. (一) 应用程序窗口小部件App Widgets 应用程序窗口小部件(Widget ...
随机推荐
- 树莓派3B/3B+/4B 刷机装系统烧录镜像教程
树莓派3B/3B+/4B 刷机装系统烧录镜像教程 树莓派 背景故事 刚拿到树莓派的第一件事,应该就是要装系统了,那么应该怎么操作呢?下面就给大家介绍一下吧. 硬件准备 树莓派:3B/3B+/4B,本教 ...
- Redis实战-详细配置-优雅的使用Redis注解/RedisTemplate
1. 简介 当我们对redis的基本知识有一定的了解后,我们再通过实战的角度学习一下在SpringBoot环境下,如何优雅的使用redis. 我们通过使用SpringBoot内置的Redis注解(文章 ...
- Docker部署Mysql实践
前言:由于Docker部署容器时,没有指定IP,当机器重启后,容器的IP会变化,所以在创建容器的时候,最好能固定IP:同时,在Ubuntu系统中,每次执行命令,都需要root权限,命令需要加sudo标 ...
- WPF基础:Dispatcher介绍
Disaptcher作用 不管是WinForm应用程序还是WPF应用程序,实际上都是一个进程,一个进程可以包含多个线程,其中有一个是主线程,其余的是子线程.在WPF或WinForm应用程序中,主线程负 ...
- 华为应用市场更新APP多次被拒
最近公司的APP发布了新版本,只进行了线上bug的修复,基本没改什么主体业务功能.各大应用市场都顺利更新上架,但是国货之光华为,被闷了几次.拒来拒去,就是那些反复的内容.内容一般如下: 经检测发现,您 ...
- [08 Go语言基础-for循环]
[08 Go语言基础-for循环] 循环 循环语句是用来重复执行某一段代码. for 是 Go 语言唯一的循环语句.Go 语言中并没有其他语言比如 C 语言中的 while 和 do while 循环 ...
- 【XSS-labs】level 16-20
Level 16 查看源码:发现 空格 / 和script都被转义了. 用img标签的onerror事件(在加载外部文档或图片出错后触发),空格用%0a绕过, payload如下: <img% ...
- Windows内核-7-(IRP)I/O请求包
Windows内核-7-(IRP)I/O请求包 IRP(I/O Request Packet)就是一个进行I/O操作的请求包. IRP是一个结构体,谁分配谁就得释放,通常由执行体里的管理器,获取内核驱 ...
- Elasticsearch BM25相关度算法超详细解释
Photo by Pixabay from Pexels 前言:日常在使用Elasticsearch的搜索业务中多少会出现几次 "为什么这个Doc分数要比那个要稍微低一点?".&q ...
- pytorch之对预训练的bert进行剪枝
大体过程 对层数进行剪枝 1.加载预训练的模型: 2.提取所需要层的权重,并对其进行重命名.比如我们想要第0层和第11层的权重,那么需要将第11层的权重保留下来并且重命名为第1层的名字: 3.更改模型 ...