Netty 權(quán)威指南筆記(四):架構(gòu)剖析

Netty 權(quán)威指南筆記(四):架構(gòu)剖析

對(duì) Netty 的架構(gòu)進(jìn)行剖析,學(xué)習(xí)其設(shè)計(jì),便于在今后的架構(gòu)設(shè)計(jì)中,設(shè)計(jì)出高性能、高可靠、可擴(kuò)展的產(chǎn)品。

Netty 邏輯架構(gòu)

Netty 采用了典型的三層網(wǎng)絡(luò)架構(gòu)進(jìn)行設(shè)計(jì)和開發(fā),其邏輯架構(gòu)如下圖所示:

Netty 邏輯架構(gòu)圖
  1. Reactor 通信調(diào)度層:由一系列輔助類組成,包括 Reactor 線程 NioEventLoop 及其父類,NioSocketChannel 和 NioServerSocketChannel 等等。該層的職責(zé)就是監(jiān)聽網(wǎng)絡(luò)的讀寫和連接操作,負(fù)責(zé)將網(wǎng)絡(luò)層的數(shù)據(jù)讀到內(nèi)存緩沖區(qū),然后觸發(fā)各自網(wǎng)絡(luò)事件,例如連接創(chuàng)建、連接激活、讀事件、寫事件等。將這些事件觸發(fā)到 pipeline 中,由 pipeline 管理的職責(zé)鏈來(lái)進(jìn)行后續(xù)的處理。
  2. 職責(zé)鏈 ChannelPipeline:負(fù)責(zé)事件在職責(zé)鏈中的有序傳播,以及負(fù)責(zé)動(dòng)態(tài)地編排職責(zé)鏈。職責(zé)鏈可以選擇監(jiān)聽和處理自己關(guān)心的事件,攔截處理和向后傳播事件。
  3. 業(yè)務(wù)邏輯編排層:業(yè)務(wù)邏輯編排層通常有兩類,一類是純粹的業(yè)務(wù)邏輯編排,一類是應(yīng)用層協(xié)議插件,用于特定協(xié)議相關(guān)的會(huì)話和鏈路管理。由于應(yīng)用層協(xié)議棧往往是開發(fā)一次到處運(yùn)行,并且變動(dòng)較小,故而將應(yīng)用協(xié)議到 POJO 的轉(zhuǎn)變和上層業(yè)務(wù)放到不同的 ChannelHandler 中,就可以實(shí)現(xiàn)協(xié)議層和業(yè)務(wù)邏輯層的隔離,實(shí)現(xiàn)架構(gòu)層面的分層隔離。

關(guān)鍵架構(gòu)質(zhì)量屬性

Netty 是一個(gè)高性能的、高可靠的、可擴(kuò)展的異步通信框架,那么高性能、高可靠、可擴(kuò)展設(shè)計(jì)體現(xiàn)在哪里呢?

高性能

性能是設(shè)計(jì)出來(lái)的,而不是測(cè)試出來(lái)的。那么,Netty 的架構(gòu)設(shè)計(jì)是如何實(shí)現(xiàn)高性能的呢?

  1. 采用異步非阻塞的 I/O 類庫(kù),基于 Reactor 模式實(shí)現(xiàn),解決了傳統(tǒng)同步阻塞 I/O 模式下服務(wù)端無(wú)法平滑處理客戶端線性增長(zhǎng)的問題。
  2. TCP 接收和發(fā)送緩沖區(qū)采用直接內(nèi)存代替堆內(nèi)存,避免了內(nèi)存復(fù)制,提升了 I/O 讀取和寫入性能。
  3. 支持通過內(nèi)存池的方式循環(huán)利用 ByteBuf,避免了頻繁創(chuàng)建和銷毀 ByteBuf 帶來(lái)的性能消耗。
  4. 可配置的 I/O 線程數(shù)目和 TCP 參數(shù)等,為不同用戶提供定制化的調(diào)優(yōu)參數(shù),滿足不同的性能場(chǎng)景。
  5. 采用環(huán)形數(shù)組緩沖區(qū),實(shí)現(xiàn)無(wú)鎖化并發(fā)編程,代替?zhèn)鹘y(tǒng)的線程安全容器或鎖。
  6. 合理使用線程安全容器、原子類等,提升系統(tǒng)的并發(fā)能力。
  7. 關(guān)鍵資源的使用采用單線程串行化的方式,避免多線程并發(fā)訪問帶來(lái)的鎖競(jìng)爭(zhēng)和額外的 CPU 資源消耗問題。
  8. 通過引用計(jì)數(shù)器及時(shí)地釋放不再被引用的對(duì)象,細(xì)粒度的內(nèi)存管理降低了 GC 的頻率,減少頻繁 GC 帶來(lái)的時(shí)延增大和 CPU 損耗。

高可靠

  1. 鏈路有效性檢測(cè):由于長(zhǎng)連接不需要每次發(fā)送消息都創(chuàng)建鏈路,也不需要在消息完成交互時(shí)關(guān)閉鏈路,因此相對(duì)于短連接性能更高。為了保證長(zhǎng)連接的鏈路有效性,往往需要通過心跳機(jī)制周期性地進(jìn)行鏈路檢測(cè)。使用心跳機(jī)制的原因是,避免在系統(tǒng)空閑時(shí)因網(wǎng)絡(luò)閃斷而斷開連接,之后又遇到海量業(yè)務(wù)沖擊導(dǎo)致消息積壓無(wú)法處理。為了解決這個(gè)問題,需要周期性地對(duì)鏈路進(jìn)行有效性檢測(cè),一旦發(fā)現(xiàn)問題,可以及時(shí)關(guān)閉鏈路,重建 TCP 連接。為了支持心跳,Netty 提供了兩種鏈路空閑檢測(cè)機(jī)制:
    • 讀空閑超時(shí)機(jī)制:連續(xù) T 周期沒有消息可讀時(shí),發(fā)送心跳消息,進(jìn)行鏈路檢測(cè)。如果連續(xù) N 個(gè)周期沒有讀取到心跳消息,可以主動(dòng)關(guān)閉鏈路,重建連接。
    • 寫空閑超時(shí)機(jī)制:連續(xù) T 周期沒有消息需要發(fā)送時(shí),發(fā)送心跳消息,進(jìn)行鏈路檢測(cè)。如果連續(xù) N 個(gè)周期沒有讀取對(duì)方發(fā)回的心跳消息,可以主動(dòng)關(guān)閉鏈路,重建連接。
  2. 內(nèi)存保護(hù)機(jī)制:Netty 提供多種機(jī)制對(duì)內(nèi)存進(jìn)行保護(hù),包括以下幾個(gè)方面:
    • 通過對(duì)象引用計(jì)數(shù)器對(duì) ByteBuf 進(jìn)行細(xì)粒度的內(nèi)存申請(qǐng)和釋放,對(duì)非法的對(duì)象引用進(jìn)行檢測(cè)和保護(hù)。
    • 可設(shè)置的內(nèi)存容量上限,包括 ByteBuf、線程池線程數(shù)等,避免異常請(qǐng)求耗光內(nèi)存。
  3. 優(yōu)雅停機(jī):優(yōu)雅停機(jī)功能指的是當(dāng)系統(tǒng)推出時(shí),JVM 通過注冊(cè)的 Shutdown Hook 攔截到退出信號(hào)量,然后執(zhí)行推出操作,釋放相關(guān)模塊的資源占用,將緩沖區(qū)的消息處理完成或清空,將待刷新的數(shù)據(jù)持久化到磁盤和數(shù)據(jù)庫(kù)中,等到資源回收和緩沖區(qū)消息處理完成之后,再退出。

可定制、易擴(kuò)展

  1. 責(zé)任鏈模式:ChannelPipeline 基于責(zé)任鏈模式開發(fā),便于業(yè)務(wù)邏輯的攔截、定制和擴(kuò)展。
  2. 基于接口的開發(fā):關(guān)鍵的類庫(kù)都提供了接口或抽象類,便于用戶自定義實(shí)現(xiàn)。
  3. 提供大量的工廠類,通過重載這些工廠類,可以按需創(chuàng)建出用戶需要的對(duì)象。
  4. 提供大量系統(tǒng)參數(shù)供用戶按需設(shè)置,增強(qiáng)系統(tǒng)的場(chǎng)景定制性。

總結(jié),是為了強(qiáng)化學(xué)習(xí)效果。

最后編輯于
?著作權(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),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 前奏 https://tech.meituan.com/2016/11/04/nio.html 綜述 netty通...
    jiangmo閱讀 6,201評(píng)論 0 13
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,777評(píng)論 25 709
  • 這次試試按鍵的操作,直接上 連線圖: 按鍵一個(gè)引腳接pin-2,另一邊是一個(gè)電阻,以及5v,當(dāng)按鍵按下,開關(guān)閉合,...
    cheneydc閱讀 598評(píng)論 0 3
  • 天堂鳥
    jiesen杰森閱讀 176評(píng)論 1 2
  • 我從班級(jí)群里找到方楠的頭像,點(diǎn)開單獨(dú)的聊天窗口,給她單獨(dú)發(fā)了消息:“我來(lái)上海了,有空聚聚吧!” 過了不到兩分鐘,她...
    楓陽(yáng)閱讀 337評(píng)論 0 1

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