chapter20 Netty架構剖析

chapter20 Netty架構剖析

1. Netty邏輯架構

  1. Reactor通信調度層
    • 一系列輔助類完成,包括Reactor線程NioEventLoop及其父類,NioSocketChannel、NioServerSocketChannel及其父類,ByteBuffer、Buffer、Unsafe等
    • 主要職責是監聽網咯的讀寫和連接操作,負責將網絡層的數據讀取到內存緩衝區中,然後觸發各種網絡事件到PipeLine中。
  2. 職責鏈ChannelPipeline
    • 負責事件在職責鏈中有序傳播,同時負責動態地編排職責鏈。上層業務只需要關心處理業務,不需要感知底層的協議差異和線程模型差異,實現架構層面的分層隔離。
  3. 業務邏輯編排層(service ChannelHandler)
    • 兩類:一類是純粹的業務邏輯編排,還有一類是其他的應用層協議插件,用於特定協議相關的會話和鏈路管理。

2. 關鍵架構質量屬性

  1. 高性能

    1. 採用異步非阻塞IO,基於Reactor模式實現
    2. TCP接收和發送緩衝區使用直接內存代替堆內存,避免了內存複製,提升IO的讀寫性能
    3. 支持通過內存池的方式循環利用ByteBuf,避免了創建和銷燬ByteBuf帶來的性能損耗
    4. 可配置的IO線程數、TCP參數等
    5. 採用環形數組緩衝區實現無鎖化併發編程,代替傳統的線程安全容器或者鎖。
    6. 合理地使用線程安全容器、原子類等
    7. 關鍵資源的處理使用單線程串行化的方式,避免多線程併發帶來的鎖競爭和額外的cpu資源消耗問題
    8. 通過引用計數器及時地申請釋放不再被引用的對象,細粒度的內存管理降低了GC的頻率,減少了頻繁GC帶來的時延增大和cpu損耗
  2. 可靠性

    1. 鏈路有效性檢測[心跳檢測]
      • Netty提供的兩種鏈路空閒檢測機制:
      • 讀空閒超時機制:當連續週期T沒有消息可讀時,觸發超時Handler,用戶可以基於讀空閒超時發送心跳消息,進行鏈路檢測;如果連續N個週期仍然沒有讀取到心跳消息,可主動關閉鏈路。
      • 寫空閒超時機制:同上,在沒有發送消息時進行檢測
    2. 內存保護機制
      • 通過對象引用計數器對Netty的ByteBuf燈內置對象進行細粒度的內存申請和釋放,對非對象引用進行檢測和保護
      • 通過內存池來重用ByteBuf,節省內存
      • 可設置的內存容量上限,包括ByteBuf、線程池線程數等
    3. 優雅停機
      • 優雅停機往往需要設置個最大超時時間T,如果達到T後系統仍然沒有退出,則通過Kill -9 pid強殺當前的進程
      • Netty所有涉及到資源回收和釋放的都提供了接口實現優雅停機
    4. 可定製性
      • 責任鏈模式,ChannelPipeline基於責任鏈模式開發
      • 基於接口的開發,關鍵的類庫都提供了接口或者抽象類
      • 提供了大量工廠類,通過重載這些工廠類可以按需創建出用戶實現的對象
      • 提供了大量的系統參數供用戶按需設置
    5. 可擴展性
      • 擴展協議棧不需要修改Netty源碼,直接基於二進制類庫即可實現協議的擴展和定製。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章