专题目录

RocketMQ详解(一)原理概览

RocketMQ详解(二)安装使用详解

RocketMQ详解(三)启动运行原理

RocketMQ详解(四)核心设计原理

RocketMQ详解(五)总结提高

引子

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

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

一、nameserver启动原理

如上图所示,nameServer名字服务作为rocketMQ的基于Topic路由的注册中心,支持Broker的动态注册与发现,nameServer启动流程如下:

  1. 加载kv配置。
  2. 构建NettyRemotingServer初始化netty通信实例。
  3. 初始化远程通信执行器。
  4. 注册请求执行器。
  5. 定时轮训清除宕机的broker。
  6. 注册SSL证书变化监听器。
  7. 启动远程通信服务端(netty)。
  8. 启动SSL证书监听服务。

其中,1-6步是初始化过程,7-8是启动流程。

二、broker启动原理

broker作为消息代理服务器,用于接收并存储消息,等待被消费者拉取消费。broker启动分两大部分:

  • 初始化:构造createBrokerController-》初始化controller.initialize()
  • 启动:controller.start()

如下图:

2.1 broker初始化流程

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

2.2 broker启动流程

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

三、producer启动原理

如上图,生产者作为消息发送方,producer启动流程如下:

  1. checkConfig()校验配置
  2. MQClientInstance创建客户端实例。
  3. registerProducer向broker注册生产者。
  4. MQClientInstance.start()启动客户端实例。
  5. 服务状态更新为RUNNING。
其中第四步,MQClientInstance客户端实例启动流程如下:
  1. 获取nameserver地址。
  2. remotingClient.start():启动netty远程客户端。
  3. startScheduledTask():开启定时任务。
  4. pullMessageService.start() :开启守护线程,执行拉取消息
  5. rebalanceService.start():启动负载均衡器
  6. DefaultMQProducerImpl().start():启动消息生产者
  7. 客户端实例状态更新为RUNNING
其中第三步,定时任务包含:
  • 1)延迟10ms后,获取每2分钟更新一次nameserver地址
  • 2)延迟10ms后,每30s去nameserver获取最新topic路由
  • 3)延迟1s后,每30s移除一次下线的broker+给所有broker发送心跳(版本号)
  • 4)延迟10s后,每5s持久化“消费offset”到broker/本地。
  • 5)延迟1ms后,每1分钟,根据待消息数,动态调整消费者线程池核心数。(被阉割,目前是空)
 
 

四、consumer启动原理

消费者启动流程,见第三节的图。

消费者启动流程如下:

  1. checkConfig():校验配置
  2. copySubscription:复制订阅信息
  3. MQClientInstance:创建客户端实例
  4. rebalanceImpl:创建消费端负载均衡
  5. pullAPIWrapper:创建pull请求包装器
  6. offsetStore初始化偏移量:广播模式:client存储;集群模式:broker存储
  7. consumeMessageService.start():初始化消费消息服务,并启动。1.并发消费:延迟15m后,每过15分钟清理一次超时未处理完消息 2.顺序消息:延迟1s后,每20s锁一次broker中mq队列+消费者端ProcessQueue
  8. registerConsumer:向broker注册消费者。
  9. MQClientInstance.start():启动客户端实例
  10. 服务状态更新为:RUNNING

RocketMQ详解(三)启动运行原理的更多相关文章

  1. RocketMQ详解(一)原理概览

    专题目录 RocketMQ详解(一)原理概览 RocketMQ详解(二)安装使用详解 RocketMQ详解(三)启动运行原理 RocketMQ详解(四)核心设计原理 RocketMQ详解(五)总结提高 ...

  2. Activity详解三 启动activity并返回结果

    首先看演示: 1 简介 .如果想在Activity中得到新打开Activity 关闭后返回的数据,需要使用系统提供的startActivityForResult(Intent intent, int ...

  3. Activity详解三 启动activity并返回结果 转载 https://www.cnblogs.com/androidWuYou/p/5886991.html

    首先看演示: 1 简介 .如果想在Activity中得到新打开Activity 关闭后返回的数据,需要使用系统提供的startActivityForResult(Intent intent, int ...

  4. RocketMQ详解(四)核心设计原理

    专题目录 RocketMQ详解(一)原理概览 RocketMQ详解(二)安装使用详解 RocketMQ详解(三)启动运行原理 RocketMQ详解(四)核心设计原理 RocketMQ详解(五)总结提高 ...

  5. RocketMQ详解(二)安装使用详解

    专题目录 RocketMQ详解(一)原理概览 RocketMQ详解(二)安装使用详解 RocketMQ详解(三)启动运行原理 RocketMQ详解(四)核心设计原理 RocketMQ详解(五)总结提高 ...

  6. 淘宝JAVA中间件Diamond详解(2)-原理介绍

    淘宝JAVA中间件Diamond详解(二)---原理介绍 大家好,通过第一篇的快速使用,大家已经对diamond有了一个基本的了解.本次为大家带来的是diamond核心原理的介绍,主要包括server ...

  7. [转帖]万字详解Oracle架构、原理、进程,学会世间再无复杂架构

    万字详解Oracle架构.原理.进程,学会世间再无复杂架构 http://www.itpub.net/2019/04/24/1694/ 里面的图特别好 数据和云 2019-04-24 09:11:59 ...

  8. 转:Windows下的PHP开发环境搭建——PHP线程安全与非线程安全、Apache版本选择,及详解五种运行模式。

    原文来自于:http://www.ituring.com.cn/article/128439 Windows下的PHP开发环境搭建——PHP线程安全与非线程安全.Apache版本选择,及详解五种运行模 ...

  9. Android 之窗口小部件详解(三)  部分转载

    原文地址:http://blog.csdn.net/iefreer/article/details/4626274. (一) 应用程序窗口小部件App Widgets 应用程序窗口小部件(Widget ...

随机推荐

  1. 2020年Android开发市场真的饱和了吗?

    公司在杭州,根据我的不客观数据体验来看,最饱和的是iOS,同样发布一个职位iOS是其他技术岗位10倍的投递量. 当然Android作为一个已经市场化十余年的技术门类,它必然早已经是成熟常态.这样的技术 ...

  2. alpakka-kafka(7)-kafka应用案例,消费模式

    上篇描述的kafka案例是个库存管理平台.是一个公共服务平台,为其它软件模块或第三方软件提供库存状态管理服务.当然,平台管理的目标必须是共享的,即库存是作为公共资源开放的.这个库存管理平台是一个Kaf ...

  3. Linux进程理解与实践(四)wait函数处理僵尸进程

    Wait的背景 当子进程退出的时候,内核会向父进程发送SIGCHLD信号,子进程的退出是个异步事件(子进程可以在父进程运行的任何时刻终止) 子进程退出时,内核将子进程置为僵尸状态,这个进程称为僵尸进程 ...

  4. 【笔记】衡量线性回归法的指标 MSE,RMS,MAE以及评价回归算法 R Square

    衡量线性回归法的指标 MSE,RMS,MAE以及评价回归算法 R Square 衡量线性回归法的指标 对于分类问题来说,我们将原始数据分成了训练数据集和测试数据集两部分,我们使用训练数据集得到模型以后 ...

  5. 前端从😳 到🚪 gRPC 框架

    RPC 是什么? RPC 英文全称是 Remote Procedure Call 既远程过程调用,维基百科中给的定义是一个计算机调用了一个函数,但这个函数并不在这台计算机上,这种远程调用方式程序员无需 ...

  6. 题解 Sequence

    传送门 只会爆搜系列 关于「本质不同的子序列个数」:限定长度,无限制(就是这题) 无限制的柿子是(令 \(dp[i]\) 为以 \(i\) 为结尾的不同子序列个数) \(dp[i] = \sum dp ...

  7. FPGA学习过程(一)

    前言 终于有时间折腾这块fpga开发板了,不知不觉又熬夜了. 正文 实现一个呼吸灯的项目 打开quartus ii 建立工程 步骤就不讲了 新建一个pwm.v文件内容 module PWM ( inp ...

  8. bicabo C#多线程详解(三)

    继续上一节的问题:调换两个新创建的线程启动顺序会是什么结果? using System; using System.Threading;namespace Test{    class TestThr ...

  9. WPF 窗口 最前端 Topmost Owner

    WPF 中,如果我们想把某个窗口一直置于最前端,那么可以设置Topmost=true; 但是,这样就会有另外一个问题,就时你这个窗口,会一直处于最顶层,即使你想切换到其他程序的时候. 比如,你自己写的 ...

  10. 【springcloud】hystrix面试题

    1 hystrix是什么? Netflix(国外最大的类似于,爱奇艺,优酷)视频网站,五六年前,也是,感觉自己的系统,整个网站,经常出故障,可用性不太高 有时候一些vip会员不能支付,有时候看视频就卡 ...