RocketMQ 5.1.0 提供者端 源碼分析 函部分jvm源碼

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。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容