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。