RocketMQ 源碼學習 3 :Remoting 模塊
(點擊
上方公眾號
,可快速關注)
來源:謝晞鳴 ,
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技能
※使用 JITWatch 查看 JVM 的 JIT 編譯代碼
※塵埃落定,JDK 11 確定將引入 Shebang #! 符號
TAG:ImportNew |