Java非同步NIO框架Netty實現高效能高併發
阿新 • • 發佈:2019-02-03
RPC包括:訊息的編碼、解碼、讀取和傳送;
轉自:http://blog.csdn.net/woshisap/article/details/74022825本文是對上述文章的總結、精簡。
2.1. RPC呼叫的效能模型分析
2.1.1. 傳統RPC呼叫效能差的三宗罪
網路傳輸方式問題;序列化方式問題;執行緒模型問題;
2.1.2. 高效能的三個主題
1) 傳輸;2) 協議;3) 執行緒
2.2. Netty高效能之道
2.2.1. 非同步非阻塞通訊
Netty的IO執行緒NioEventLoop由於聚合了多路複用器Selector,可以同時併發處理成百上千個客戶端Channel,由於讀寫操作都是非阻塞的,這就可以充分提升IO執行緒的執行效率,避免由於頻繁IO阻塞導致的執行緒掛起
2.2.2. 零拷貝
1) Netty的接收和傳送ByteBuffer採用DIRECT BUFFERS,使用堆外直接記憶體進行Socket讀寫,不需要進行位元組緩衝區的二次拷貝
2) Netty提供了組合Buffer物件,可以聚合多個ByteBuffer物件,使用者可以像操作一個Buffer那樣方便的對組合Buffer進行操作
3) Netty的檔案傳輸採用了transferTo方法,它可以直接將檔案緩衝區的資料傳送到目標Channel
2.2.3. 記憶體池
對於緩衝區Buffer,特別是對於堆外直接記憶體的分配和回收,是一件耗時的操作。為了儘量重用緩衝區,Netty提供了基於記憶體池的緩衝區重用機制。
效能測試表明,採用記憶體池的ByteBuf相比於朝生夕滅的ByteBuf,效能高23倍左右(效能資料與使用場景強相關)。
2.2.4. 高效的Reactor執行緒模型
常用的Reactor執行緒模型有三種,分別如下:
1) Reactor單執行緒模型;
2) Reactor多執行緒模型;
3) 主從Reactor多執行緒模型
2.2.5. 無鎖化的序列設計理念
可以通過序列化設計,即訊息的處理儘可能在同一個執行緒內完成,期間不進行執行緒切換,這樣就避免了多執行緒競爭和同步鎖。通過調整NIO執行緒池的執行緒引數,可以同時啟動多個序列化的執行緒並行執行,這種區域性無鎖化的序列執行緒設計相比一個佇列-多個工作執行緒模型效能更優。
2.2.6. 高效的併發程式設計
Netty的高效併發程式設計主要體現在如下幾點:
1) volatile的大量、正確使用;
2) CAS和原子類的廣泛使用;
3) 執行緒安全容器的使用;
4) 通過讀寫鎖提升併發效能。
2.2.7. 高效能的序列化框架
影響序列化效能的關鍵因素總結如下:
1) 序列化後的碼流大小(網路頻寬的佔用);
2) 序列化&反序列化的效能(CPU資源佔用);
3) 是否支援跨語言(異構系統的對接和開發語言切換)。
Netty預設提供了對Google Protobuf的支援
2.2.8. 靈活的TCP引數配置能力