chapter20 Netty架構剖析
1. Netty邏輯架構
- Reactor通信調度層
- 一系列輔助類完成,包括Reactor線程NioEventLoop及其父類,NioSocketChannel、NioServerSocketChannel及其父類,ByteBuffer、Buffer、Unsafe等
- 主要職責是監聽網咯的讀寫和連接操作,負責將網絡層的數據讀取到內存緩衝區中,然後觸發各種網絡事件到PipeLine中。
- 職責鏈ChannelPipeline
- 負責事件在職責鏈中有序傳播,同時負責動態地編排職責鏈。上層業務只需要關心處理業務,不需要感知底層的協議差異和線程模型差異,實現架構層面的分層隔離。
- 業務邏輯編排層(service ChannelHandler)
- 兩類:一類是純粹的業務邏輯編排,還有一類是其他的應用層協議插件,用於特定協議相關的會話和鏈路管理。
2. 關鍵架構質量屬性
高性能
- 採用異步非阻塞IO,基於Reactor模式實現
- TCP接收和發送緩衝區使用直接內存代替堆內存,避免了內存複製,提升IO的讀寫性能
- 支持通過內存池的方式循環利用ByteBuf,避免了創建和銷燬ByteBuf帶來的性能損耗
- 可配置的IO線程數、TCP參數等
- 採用環形數組緩衝區實現無鎖化併發編程,代替傳統的線程安全容器或者鎖。
- 合理地使用線程安全容器、原子類等
- 關鍵資源的處理使用單線程串行化的方式,避免多線程併發帶來的鎖競爭和額外的cpu資源消耗問題
- 通過引用計數器及時地申請釋放不再被引用的對象,細粒度的內存管理降低了GC的頻率,減少了頻繁GC帶來的時延增大和cpu損耗
可靠性
- 鏈路有效性檢測[心跳檢測]
- Netty提供的兩種鏈路空閒檢測機制:
- 讀空閒超時機制:當連續週期T沒有消息可讀時,觸發超時Handler,用戶可以基於讀空閒超時發送心跳消息,進行鏈路檢測;如果連續N個週期仍然沒有讀取到心跳消息,可主動關閉鏈路。
- 寫空閒超時機制:同上,在沒有發送消息時進行檢測
- 內存保護機制
- 通過對象引用計數器對Netty的ByteBuf燈內置對象進行細粒度的內存申請和釋放,對非對象引用進行檢測和保護
- 通過內存池來重用ByteBuf,節省內存
- 可設置的內存容量上限,包括ByteBuf、線程池線程數等
- 優雅停機
- 優雅停機往往需要設置個最大超時時間T,如果達到T後系統仍然沒有退出,則通過Kill -9 pid強殺當前的進程
- Netty所有涉及到資源回收和釋放的都提供了接口實現優雅停機
- 可定製性
- 責任鏈模式,ChannelPipeline基於責任鏈模式開發
- 基於接口的開發,關鍵的類庫都提供了接口或者抽象類
- 提供了大量工廠類,通過重載這些工廠類可以按需創建出用戶實現的對象
- 提供了大量的系統參數供用戶按需設置
- 可擴展性
- 擴展協議棧不需要修改Netty源碼,直接基於二進制類庫即可實現協議的擴展和定製。
- 鏈路有效性檢測[心跳檢測]