
broker启动
由此进入broker中。

基础服务启动

基础服务启动流程

netty启动

netty执行链启动

NettyServerHandler 实现

请求命令处理类

处理器注册
处理函数在createBrokerController创建时进行初始化。也即在此处调用前就已经将所有处理器注册到processorTable中。

命令处理器

消息处理
此处使用SendMessageProcessor作为案例实现。

处理上下文构建

构建内部消息对象

消息处理

异步处理
在异步中将同步函数包装成future来完成的。但是此处紧接是将结果进行了包装,根据执行来看依然会执行同步的putMessage函数,然后他的结果返回后触发后面的future中then的调用。需要注意的是此处的asyncPutMessage在子类中重载了,故而不会触发此处。

函数调用
信息同步:同步和异步的putmessage都会进入到此处。接下来以asyncPutMessage开始讲述。

进入commitlog类

获取映射文件

image.png
获取最后一个文件,需要注意的是不一定获取到。

image.png

image.png
needcreate 此处传入的是true。

计算偏移

创建文件

将创建的文件添加到列表中
至此:一定是获取到了消息文件。

添加消息
上图中onCommitLogAppend函数为空所以忽略即可。

image.png

image.png
appendMessageBuffer()函数中获取的是mappedByteBuffer对象,便于前文的 MappedFile所对应。

image.png
至此文件写入便结束了。但是目前来说写入的数据依然在内存中,什么时候刷盘呢?需要再次返回到asyncPutMessage处,继续执行,如下图。

image.png

image.png

image.png

image.png
同步和异步区别不大,都是唤醒线程工作,只不过实现不同。

image.png
只要唤醒就刷,需要注意的是mappedFileQueue.flush(0)传入参数是0

image.png
而此处则传入了配置中的个数。

image.png

image.png

image.png

image.png
最终执行此处,进入到操作系统进行MSYNC。