(點選上方公眾號,可快速關註)
來源:謝晞鳴 ,
fdx321.github.io/2017/08/21/【RocketMQ原始碼學習】3-Remoting模組/
rocketmq-remoting 模組是 RocketMQ 中負責網路通訊的模組,被其他所有需要網路通訊的模組依賴。它是基於 Netty 實現的,避免了網路程式設計很多 tricky 的問題。
首先來看下 RocketMQ NettyServer 的 Reactor 執行緒模型,一個 Reactor 主執行緒負責監聽 TCP 連線請求,建立好連線後丟給 Reactor 執行緒池,它負責將建立好連線的 socket 註冊到 selector 上去(這裡有兩種方式,NIO和Epoll,可配置),然後監聽真正的網路資料。拿到網路資料後,再丟給 Worker 執行緒池。
Worker 拿到網路資料後,就交給 Pipeline,從 Head 到 Tail 一個個 Handler 的走下去,這些 Handler 是在建立 Server 的時候指定的。NettyEncoder 和 NettyDecoder 負責網路資料和 RemotingCommand 之間的編解碼。
NettyServerHandler 拿到解碼得到的 RemotingCommand 後,根據 RemotingCommand.type 來判斷是 request 還是 response,如果是 request, 就根據 RomotingCommand 的 code(code用來標識不同型別的請求) 去 processorTable 找到對應的 processor,然後封裝成 task 後,丟給對應的 processor 執行緒池, 如果是 response 就根據RemotingCommand.opaque 去 responseTable 中拿到對應的 ResponseFuture,把結果 set 給它。
對於 Client,經過 Pipeline 的順序是從 Tail 到 Head。不管是 Server 和 Client,並不是每次資料流轉都得經過所有的 Handler,而是會根據 Context 中的一些資訊去判斷。
整個資料流轉過程中還有很多hook, 比如處理 command 前,處理 command 後,傳送資料前,傳送資料後等。
關於 Netty 的一些關鍵知識點,Netty學習筆記中做了些總結。
https://fdx321.github.io/2016/11/07/Netty%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/
以上所有扯淡都是基於原始碼 https://github.com/apache/incubator-rocketmq (tag:rocketmq-all-4.1.0-incubating)所貼程式碼有所刪減。
看完本文有收穫?請轉發分享給更多人
關註「ImportNew」,提升Java技能