【源码解析8】broker源码解析

47 阅读2分钟

代码位置定位

先让我们找到类org.apache.rocketmq.broker.BrokerStartup
该类的main方法通过调用BrokerController的start()方法,尝试启动broker image.png

启动过程代码解析

从下图我们可以看出,启动分两步:  
1. 是初始化BrokerContoller
2. 是调用BrokerController的start()方法,启动broker

image.png

初始化过程

初始化的过程主要是读取配置,在namesrv上注册自身,初始化Processor线程池(该线程池用来处理投递和拉取的请求)

start过程

主要分两部分

  1. 数据存储服务、远程服务、快速远程服务、broker外部api、拉取请求服务、客户端保持服务、过滤服务、broker启动管理服务、broker快速失败服务的启动
  2. 将自身注册到namesrv上,并建立的心跳,心跳的间隔默认是30秒 image.png

如果有多个namesrv,则使用CountDownLatch技术,等到所有的namesrv都注册成功,再进行后续操作 image.png

Message的存储

Message的存储是通过MessageStore服务的CommitLog组件实现的,broker中的数据会写入commit-log文件中,如果commit-log文件大于了1G,则会再新建一个新的文件,进行数据存储。
文件的命名以数据的偏移量命名,比如第二个文件的名字就是00000000001073741824(1G=102410241024KB=1073741824KB)

image.png 数据存储的过程使用了内存队列,即在内存中构造一个队列,并将数据存储在这个队列中,然后写一个消费者将数据写入磁盘(写磁盘的任务每500ms执行一次,每次会刷4页的数据,也就是每次会刷 4页*4KB=16KB 的数据到磁盘)