
broker啟動(dòng)
由此進(jìn)入broker中。

基礎(chǔ)服務(wù)啟動(dòng)

基礎(chǔ)服務(wù)啟動(dòng)流程

netty啟動(dòng)

netty執(zhí)行鏈啟動(dòng)

NettyServerHandler 實(shí)現(xiàn)

請(qǐng)求命令處理類

處理器注冊(cè)
處理函數(shù)在createBrokerController創(chuàng)建時(shí)進(jìn)行初始化。也即在此處調(diào)用前就已經(jīng)將所有處理器注冊(cè)到processorTable中。

命令處理器

消息處理
此處使用SendMessageProcessor作為案例實(shí)現(xiàn)。

處理上下文構(gòu)建

構(gòu)建內(nèi)部消息對(duì)象

消息處理

異步處理
在異步中將同步函數(shù)包裝成future來完成的。但是此處緊接是將結(jié)果進(jìn)行了包裝,根據(jù)執(zhí)行來看依然會(huì)執(zhí)行同步的putMessage函數(shù),然后他的結(jié)果返回后觸發(fā)后面的future中then的調(diào)用。需要注意的是此處的asyncPutMessage在子類中重載了,故而不會(huì)觸發(fā)此處。

函數(shù)調(diào)用
信息同步:同步和異步的putmessage都會(huì)進(jìn)入到此處。接下來以asyncPutMessage開始講述。

進(jìn)入commitlog類

獲取映射文件

image.png
獲取最后一個(gè)文件,需要注意的是不一定獲取到。

image.png

image.png
needcreate 此處傳入的是true。

計(jì)算偏移

創(chuàng)建文件

將創(chuàng)建的文件添加到列表中
至此:一定是獲取到了消息文件。

添加消息
上圖中onCommitLogAppend函數(shù)為空所以忽略即可。

image.png

image.png
appendMessageBuffer()函數(shù)中獲取的是mappedByteBuffer對(duì)象,便于前文的 MappedFile所對(duì)應(yīng)。

image.png
至此文件寫入便結(jié)束了。但是目前來說寫入的數(shù)據(jù)依然在內(nèi)存中,什么時(shí)候刷盤呢?需要再次返回到asyncPutMessage處,繼續(xù)執(zhí)行,如下圖。

image.png

image.png

image.png

image.png
同步和異步區(qū)別不大,都是喚醒線程工作,只不過實(shí)現(xiàn)不同。

image.png
只要喚醒就刷,需要注意的是mappedFileQueue.flush(0)傳入?yún)?shù)是0

image.png
而此處則傳入了配置中的個(gè)數(shù)。

image.png

image.png

image.png

image.png
最終執(zhí)行此處,進(jìn)入到操作系統(tǒng)進(jìn)行MSYNC。