Netty原理分析

Netty是一個高性能、異步事件驅動的NIO框架,它提供了對TCP、UDP和文件傳輸的支持,作為一個異步NIO框架,Netty的所有IO操作都是異步非阻塞的,通過Future-Listener機制,用戶可以方便的主動獲取或者通過通知機制獲得IO操作結果。

作為當前最流行的NIO框架,Netty在互聯網領域、大數據分布式計算領域、游戲行業、通信行業等獲得了廣泛的應用,一些業界著名的開源組件也基于Netty的NIO框架構建。

Netty架構分析

Netty 采用了比較典型的三層網絡架構進行設計,邏輯架構圖如下所示:

第一層:Reactor 通信調度層,它由一系列輔助類完成,包括 Reactor 線程 NioEventLoop 以及其父類、NioSocketChannel/NioServerSocketChannel 以及其父類、ByteBuffer 以及由其衍生出來的各種 Buffer、Unsafe 以及其衍生出的各種內部類等。該層的主要職責就是監聽網絡的讀寫和連接操作,負責將網絡層的數據讀取到內存緩沖區中,然后觸發各種網絡事件,例如連接創建、連接激活、讀事件、寫事件等等,將這些事件觸發到 PipeLine 中,由 PipeLine 充當的職責鏈來進行后續的處理。

第二層:職責鏈 PipeLine,它負責事件在職責鏈中的有序傳播,同時負責動態的編排職責鏈,職責鏈可以選擇監聽和處理自己關心的事件,它可以攔截處理和向后/向前傳播事件,不同的應用的 Handler 節點的功能也不同,通常情況下,往往會開發編解碼 Hanlder 用于消息的編解碼,它可以將外部的協議消息轉換成內部的 POJO 對象,這樣上層業務側只需要關心處理業務邏輯即可,不需要感知底層的協議差異和線程模型差異,實現了架構層面的分層隔離。

第三層:業務邏輯處理層,可以分為兩類:

1.純粹的業務邏輯處理,例如訂單處理。

2.應用層協議管理,例如HTTP協議、FTP協議等。

接下來,我從影響通信性能的三個方面(I/O模型、線程調度模型、序列化方式)來談談Netty的架構。

IO模型

Netty的I/O模型基于非阻塞I/O實現,底層依賴的是JDK NIO框架的Selector。

Selector提供選擇已經就緒的任務的能力。簡單來講,Selector會不斷地輪詢注冊在其上的Channel,如果某個Channel上面有新的TCP連接接入、讀和寫事件,這個Channel就處于就緒狀態,會被Selector輪詢出來,然后通過SelectionKey可以獲取就緒Channel的集合,進行后續的I/O操作。

線程調度模型

常用的Reactor線程模型有三種,分別如下:

1.Reactor單線程模型:Reactor單線程模型,指的是所有的I/O操作都在同一個NIO線程上面完成。對于一些小容量應用場景,可以使用單線程模型。

2.Reactor多線程模型:Rector多線程模型與單線程模型最大的區別就是有一組NIO線程處理I/O操作。主要用于高并發、大業務量場景。

3.主從Reactor多線程模型:主從Reactor線程模型的特點是服務端用于接收客戶端連接的不再是個1個單獨的NIO線程,而是一個獨立的NIO線程池。利用主從NIO線程模型,可以解決1個服務端監聽線程無法有效處理所有客戶端連接的性能不足問題。

序列化方式

影響序列化性能的關鍵因素總結如下:

1.序列化后的碼流大小(網絡帶寬占用)

2.序列化&反序列化的性能(CPU資源占用)

3.并發調用的性能表現:穩定性、線性增長、偶現的時延毛刺等

鏈路有效性檢測

心跳檢測機制分為三個層面:

1.TCP層面的心跳檢測,即TCP的Keep-Alive機制,它的作用域是整個TCP協議棧;

2.協議層的心跳檢測,主要存在于長連接協議中。例如SMPP協議;

3.應用層的心跳檢測,它主要由各業務產品通過約定方式定時給對方發送心跳消息實現。

心跳檢測的目的就是確認當前鏈路可用,對方活著并且能夠正常接收和發送消息。作為高可靠的NIO框架,Netty也提供了基于鏈路空閑的心跳檢測機制:

1.讀空閑,鏈路持續時間t沒有讀取到任何消息;

2.寫空閑,鏈路持續時間t沒有發送任何消息;

3.讀寫空閑,鏈路持續時間t沒有接收或者發送任何消息。

零拷貝

“零拷貝”是指計算機操作的過程中,?CPU不需要為數據在內存之間的拷貝消耗資源?。而它通常是指計算機在網絡上發送文件時,不需要將文件內容拷貝到用戶空間(User Space)而??直接在內核空間(Kernel Space)中傳輸到網絡的方式

Netty的“零拷貝”主要體現在三個方面

Netty的?接收和發送ByteBuffer采用DIRECT BUFFERS,使用堆外直接內存進行Socket讀寫,不需要進行字節緩沖區的二次拷貝?。如果使用傳統的堆內存(HEAP BUFFERS)進行Socket讀寫,JVM會將堆內存Buffer拷貝一份到直接內存中,然后才寫入Socket中。相比于堆外直接內存,消息在發送過程中多了一次緩沖區的內存拷貝

讀取直接從“堆外直接內存”,不像傳統的堆內存和直接內存拷貝

ByteBufAllocator 通過ioBuffer分配堆外內存

Netty提供了?組合Buffer對象?,可以聚合多個ByteBuffer對象,用戶可以??像操作一個Buffer那樣方便的對組合Buffer進行操作?,避免了傳統通過內存拷貝的方式將幾個小Buffer合并成一個大的Buffer

Netty允許我們將多段數據合并為一整段虛擬數據供用戶使用,而過程中不需要對數據進行拷貝操作

組合Buffer對象,避免了內存拷貝

ChannelBuffer接口:Netty為需要傳輸的數據制定了統一的ChannelBuffer接口

·???????使用getByte(int index)方法來實現隨機訪問

·???????使用雙指針的方式實現順序訪問

·???????Netty主要實現了HeapChannelBuffer,ByteBufferBackedChannelBuffer,與Zero Copy直接相關的CompositeChannelBuffer類

CompositeChannelBuffer類

CompositeChannelBuffer類的作用是將多個ChannelBuffer組成一個虛擬的ChannelBuffer來進行操作

為什么說是虛擬的呢,因為CompositeChannelBuffer并沒有將多個ChannelBuffer真正的組合起來,而只是保存了他們的引用,這樣就避免了數據的拷貝,實現了Zero Copy,內部實現

其中readerIndex既讀指針和writerIndex既寫指針是從AbstractChannelBuffer繼承而來的

components是一個ChannelBuffer的數組,他保存了組成這個虛擬Buffer的所有子Buffer

indices是一個int類型的數組,它保存的是各個Buffer的索引值

lastAccessedComponentId是一個int值,它記錄了最后一次訪問時的子Buffer ID

CompositeChannelBuffer實際上就是將一系列的Buffer通過數組保存起來,然后實現了ChannelBuffer?的接口,使得在上層看來,操作這些Buffer就像是操作一個單獨的Buffer一樣

Netty的文件傳輸采用了?transferTo方法?,它可以直接將文件緩沖區的數據發送到目標Channel,避免了傳統通過循環write方式導致的內存拷貝問題

Linux中的sendfile()以及Java NIO中的FileChannel.transferTo()方法都實現了零拷貝的功能,而在Netty中也通過在FileRegion中包裝了NIO的FileChannel.transferTo()方法實現了零拷貝

Netty 的 Zero-copy 體現在如下幾個個方面:

l? Netty 提供了 CompositeByteBuf 類, 它可以將多個 ByteBuf 合并為一個邏輯上的 ByteBuf, 避免了各個 ByteBuf 之間的拷貝。

l? 通過 wrap 操作, 我們可以將byte[] 數組、ByteBuf、ByteBuffer等包裝成一個 Netty ByteBuf 對象, 進而避免了拷貝操作。

l? ByteBuf 支持 slice 操作,因此可以將 ByteBuf 分解為多個共享同一個存儲區域的ByteBuf, 避免了內存的拷貝。

l? 通過 FileRegion 包裝的FileChannel.tranferTo 實現文件傳輸, 可以直接將文件緩沖區的數據發送到目標 Channel, 避免了傳統通過循環 write 方式導致的內存拷貝問題。

轉載于:https://www.cnblogs.com/lfs2640666960/p/10010011.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/278836.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/278836.shtml
英文地址,請注明出處:http://en.pswp.cn/news/278836.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

福州大學計算機學院董晨老師,福州大學代表隊高分斬獲第三屆福建省高校網絡空間安全大賽冠軍...

新聞中心訊/10月27日,由福建省教育廳、福建省網絡與信息安全協調小組辦公室主辦的“百越杯”第三屆福建省高校網絡空間安全大賽在福州圓滿落幕,福州大學三支代表隊攬獲本屆大賽的冠軍暨特等獎、二等獎和三等獎。本次省賽福州大學派出的代表隊由數學與計算…

用uid分庫,uname上的查詢怎么辦?

2019獨角獸企業重金招聘Python工程師標準>>> 【緣起】 用戶中心是幾乎每一個公司必備的基礎服務,用戶注冊、登錄、信息查詢與修改都離不開用戶中心。 當數據量越來越大時,需要多用戶中心進行水平切分。最常見的水平切分方式,按照u…

python 新聞摘要_每日新聞摘要:運營商承諾他們不再出售您的位置…

python 新聞摘要Last year it was discovered that Verizon, Sprint, AT&T, and T-Mobile were all selling your real-time location data to third-party companies. They offered no oversight of what the companies did with the data whatsoever, and if that’s not…

Jquery中的this是什么類型

var city $("#city"); //這個city是dom還是jq if(city instanceof jQuery) alert(11); else alert(this.tagName); 總結: 1 如果是一個節點的某個事件…

計算機復試比重低的學校,又有985院校發布調劑信息,這個34所降低復試比重!...

原標題:又有985院校發布調劑信息,這個34所降低復試比重!01985院校調劑01.清華大學昨天,清華大學發布一則調劑信息:臨床醫學交叉人才培養項目接受調劑。接收調劑專業如下:據其官網介紹,該項目為推…

Silverlight 解謎游戲 之四 粒子特效

前幾篇一直在Blend中工作沒體現出開發者的作用,本篇將為訂書器(Stapler)添加自定義粒子效果,當訂書器被點擊時產生更好的視覺效果。其中將使用到nerdplusart 的Silverlight Particle Generator 粒子特效工具。 在結束本章內容后&a…

CS229 1 .線性回歸與特征歸一化(feature scaling)

線性回歸是一種回歸分析技術,回歸分析本質上就是一個函數估計的問題(函數估計包括參數估計和非參數估計),就是找出因變量和自變量之間的因果關系。回歸分析的因變量是應該是連續變量,若因變量為離散變量,則…

注冊表被黑客篡改 怎樣修復_使用快速注冊表黑客設置Office 2007配色方案

注冊表被黑客篡改 怎樣修復We’ve written previously about how to set the Office 2007 color scheme away from that awful default blue, but you can also set it with a quick registry hack or even via group policy on your network, so we’ll cover that here. 前面…

共享計算機后無法訪問磁盤,win10電腦共享硬盤無法訪問如何解決

很多用戶為了方便文件的傳輸和訪問,就會在局域網中開啟硬盤共享,正常是可以通過網絡打開訪問該用戶計算機的磁盤從而讀取數據文件,可是有win10系統用戶卻發現共享硬盤無法訪問,武大直接通過網絡打開對方的磁盤,該如何處…

mikadonic-iptables學習筆記

firewall圖像化配置[rootdesktop0 ~]# firewall-config iptabes -Fiptabes -Xiptabes -Z先設置默認規則(最后防線)[rootdesktop0 ~]# iptables -P INPUT DROP&&iptables -P OUTPUT DROP&&iptables -P FORWARD DROP iptables -A&#xf…

如何組合救援磁盤以創建最終Windows修復磁盤

We’ve covered loads of different anti-virus, Linux, and other boot disks that help you repair or recover your system, but why limit yourself to just one? Here’s how to combine your favorite repair disks together to create the ultimate repair toolkit for…

WebService C#開發/調用

簡單描述C#開發WebService操作步驟以及調用方式 WebService開發 第一步:創建Web空項目 第二步:為創建的Web空項目添加Web服務 第三步:實現WebService方法(僅供參考) 運行WebService測試 第一步:運行WebService程序,略 …

南京鐵道學院計算機應用,南京鐵道職業技術學院交通運營管理專業怎么樣

開設課程:大學英語、高等數學、計算機應用、交通運輸學、國際貿易政策與實務、班輪租船業務、運籌學、城市軌道運營管理、交通運輸規劃原理、交通運輸信息技術、運輸市場營銷學、鐵路貨運組織管理、航空運輸業務、集裝箱運輸管理、港航商務管理、交通運輸專業英語、…

C語言第九次博客作業--指針

一、PTA實驗作業 題目1:兩個4位正整數的后兩位互換 1. 本題PTA提交列表 2. 設計思路 定義循環變量i,兩個數組a[4],b[4] for i0 to 3a[i]*p取各個位*p/10 end for i0 to 3b[i]*q取各個位*q/10 end 分別對*p和*q重新賦值 3.代碼截圖 4.本題調試過程碰到問題及PTA提交列…

使用CEOP增強的Internet Explorer 8幫助保護您的孩子

Do you want to make Internet Explorer safer and more helpful for you and family? Then join us as we look at the CEOP (Child Exploitation and Online Protection Centre) enhanced version of Internet Explorer 8. 您想使Internet Explorer對您和家人更安全&#xf…

如何保持進步

文章:今日頭條 CEO 張一鳴:面試了 2000 個年輕人,混得好的都有這 5 種特質轉載于:https://www.cnblogs.com/Tpf386/p/10033670.html

MAC--PPTP教程

第一步點擊DocK-系統設置 第二步點擊網絡,進入網絡設置 第三步點擊號-創建新服務,創建新的網絡連接 第四步接口-選-類型-選-PPTP服務名稱-選-然后點擊-創建 第五步進入設置頁面-服務器地址點擊查看虛擬IP列表賬戶名稱-輸入試用帳號或是你已充值開通的帳號…

2015計算機應用基礎平時作業答案,2015秋《計算機應用基礎》第一次作業

2015秋《計算機應用基礎》第一次作業 一、單項選擇題。本大題共50個小題,每小題 2.0 分,共100.0分。在每小題給出的選項中,只有一項是符合題目要求的。 1. 第一臺電子計算機是1946年在美國研制成功的,該機的英文縮寫名是______。 …

頁面置換算法及例題

一、頁面置換算法 不適當的算法可能會導致進程發生“抖動”:即剛被換出的頁很快又要被訪問,需要將他重新調入,此時又需要再選一頁調出。而此剛被調出的頁面很快又被訪問,又需將它調入,如此頻繁地更換頁面,以…

vista磁盤使用100%_如何在Windows 7或Vista中創建和使用密碼重置磁盤

vista磁盤使用100%Forgetting your password can be an extremely frustrating situation, and we’ve already shared how to reset your password with the Ultimate Boot CD as well as the System Rescue CD, but you can prevent the situation entirely by creating a pa…