rocketmq的broker源码解读二(start方法)

2)start方法

入参为BrokerController实例;

2.1)controller.start方法

2.1.1)DefaultMessageStore#start方法

2.1.1.1)启动reputMessageService线程
2.1.1.1.1)找到构建cq与index的起点位置
遍历consumeQueueTable,找出所有consumeQueue中最大的物理偏移量maxPhysicOffset,在consumeQueue执行recover方法时,maxPhysicOffset是由offset+size而来,offset表示消息在commitLog中的物理偏移量,size表示消息大小;若maxPhysicOffset小于commitLog的minOffset,则以minOffset为起点构建cq,否则以maxPhysicOffset为起点构建cq;
2.1.1.1.2)reputMessageService.start方法
将maxPhysicOffset设置进reputMessageService线程中的reputFromOffset属性中;接着启动reputMessageService线程开始构建consumeQueue,循环构建consumeQueue和index,若接着reputFromOffset小于commitLog的maxOffset,则主线程会先进入循环,让reputMessageService线程先处理完cq,index的数据构建,使reputFromOffset保持和maxOffset持平;接着更新topicQueueTable;
在ReputMessageService#run方法中,每次执行完doReput方法后,会进行1毫秒的sleep;为了便于展开标题,构建consumeQueue专门抽出来作为一个小节4);

2.1.1.2)haService.start()和handleScheduleMessageService方法
后者方法中执行scheduleMessageService.start()方法,其中会处理delayOffset.json中消费失败后待重发的消息,即延迟消息相关,不一定是消费失败重试的消息,也可能是直接设置延时级别,直接就需要进行延时消费的消息;
2.1.1.3)启动commitLog刷盘和cq的刷盘线程
flushConsumeQueueService.start()和启动consumeQueue刷盘线程;
commitLog.start()方法中包括flushCommitLogService.start(),如果是同步刷盘则启动了GroupCommitService线程,如果是异步刷盘,则启动了FlushRealTimeService线程,commitLogService.start()则启动了CommitRealTimeService线程(负责从writeBuffer提交到fileChannel,若使用了堆外内存,则会用到);刷盘线程启动后的有许多细节逻辑,单独在第5)节来讲;
2.1.1.4)addScheduleTask() 方法
2.1.1.4.1)清理过期文件的定时任务
其中会执行的一些定时任务,其中一个定时任务会初始延迟60秒,此后每隔10秒删除commitLog和consumeQueue以及index中的过期文件,cleanCommitLogService.run()与cleanConsumeQueueService.run(),这两个service并不是线程,是普通类;关于过期文件的删除,会在第6)小节单独进行讲解;
2.1.1.4.2)磁盘预警的定时任务
向diskCheckScheduledExecutorService中提交“磁盘预警”的定时任务,延迟1分钟,周期10秒;
检查磁盘是否达到warning阈值,即90%;
若达到,设置runningFlags磁盘写满标记;
若未达到,设置runningFlags磁盘可写标记;
在存储消息前,会通过runningFlags的标记位检查磁盘状况,若状态为不可写,则直接返回;
最后设置shutdown为false;

2.1.2)启动broker端的netty服务

依次会执行NettyRemotingServer#start方法,fastRemotingServer.start方法以及BrokerOuterAPI#start方法,最后一个其中会执行NettyRemotingClient#start;这些是remoting包下的类,属于公共服务,在namesrv和生产者中已讲过;

2.1.3)启动一些其他线程或服务

包括长轮询相关的pullRequestHoldService线程;客户端netty异常事件监控的clientHousekeepingService服务;startProcessorByHa 会启动transactionalMessageCheckService线程; brokerFastFailure.start()等;

2.1.4)broker向nameserver发送心跳包

向调度线程池中添加任务,默认初次延迟10秒,每隔30s(可配置10到60s之间)向namesrv发送心跳包,执行的是registerBrokerAll方法,里边会遍历namesr地址,对每个namesr会执行一次rpc调用,默认不采用oneway模式,则会采用同步发送,即NettyRemotingClient#invokeSync方法,最终会调用NettyRemotingAbstract#invokeSyncImpl方法,请求码为RequestCode.REGISTER_BROKER;从调用路径可看出BrokerOuterAPI类是与网络发送接收相关的,相当于客户端中的MQClientAPIImpl类;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

orcharddd_real

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值