欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

Java中netty線程模型的案例分析-創(chuàng)新互聯(lián)

了解Java中netty線程模型的案例分析?這個問題可能是我們?nèi)粘W習或工作經(jīng)常見到的。希望通過這個問題能讓你收獲頗深。下面是小編給大家?guī)淼膮⒖純?nèi)容,讓我們一起來看看吧!

定制開發(fā)可以根據(jù)自己的需求進行定制,網(wǎng)站設(shè)計、成都網(wǎng)站制作構(gòu)思過程中功能建設(shè)理應(yīng)排到主要部位公司網(wǎng)站設(shè)計、成都網(wǎng)站制作的運用實際效果公司網(wǎng)站制作網(wǎng)站建立與制做的實際意義

一、 Netty簡介

Netty是一個高性能、異步事件驅(qū)動的NIO框架,基于JAVA NIO提供的API實現(xiàn)。它提供了對TCP、UDP和文件傳輸?shù)闹С?,作為一個異步NIO框架,Netty的所有IO操作都是異步非阻塞的,通過Future-Listener機制,用戶可以方便的主動獲取或者通過通知機制獲得IO操作結(jié)果。 作為當前最流行的NIO框架,Netty在互聯(lián)網(wǎng)領(lǐng)域、大數(shù)據(jù)分布式計算領(lǐng)域、游戲行業(yè)、通信行業(yè)等獲得了廣泛的應(yīng)用,一些業(yè)界著名的開源組件也基于Netty的NIO框架構(gòu)建。

二、Netty線程模型

在JAVA NIO方面Selector給Reactor模式提供了基礎(chǔ),Netty結(jié)合Selector和Reactor模式設(shè)計了高效的線程模型。先來看下Reactor模式:

2.1 Reactor模式

Wikipedia這么解釋Reactor模型:“The reactor design pattern is an event handling pattern for handling service requests delivered concurrently by one or more inputs. The service handler then demultiplexes the incoming requests and dispatches them synchronously to associated request handlers.”。首先Reactor模式首先是事件驅(qū)動的,有一個或者多個并發(fā)輸入源,有一個Server Handler和多個Request Handlers,這個Service Handler會同步的將輸入的請求多路復(fù)用的分發(fā)給相應(yīng)的Request Handler??梢匀缦聢D所示:

Java中netty線程模型的案例分析

從結(jié)構(gòu)上有點類似生產(chǎn)者和消費者模型,即一個或多個生產(chǎn)者將事件放入一個Queue中,而一個或者多個消費者主動的從這個隊列中poll事件來處理;而Reactor模式則沒有Queue來做緩沖,每當一個事件輸入到Service Handler之后,該Service Handler會主動根據(jù)不同的Evnent類型將其分發(fā)給對應(yīng)的Request Handler來處理。

2.2 Reator模式的實現(xiàn)

關(guān)于Java NIO 構(gòu)造Reator模式,Doug lea在《Scalable IO in Java》中給了很好的闡述,這里截取PPT對Reator模式的實現(xiàn)進行說明

1.第一種實現(xiàn)模型如下:

Java中netty線程模型的案例分析

這是最簡單的Reactor單線程模型,由于Reactor模式使用的是異步非阻塞IO,所有的IO操作都不會被阻塞,理論上一個線程可以獨立處理所有的IO操作。這時Reactor線程是個多面手,負責多路分離套接字,Accept新連接,并分發(fā)請求到處理鏈中。

對于一些小容量應(yīng)用場景,可以使用到單線程模型。但對于高負載,大并發(fā)的應(yīng)用卻不合適,主要原因如下:

(1)當一個NIO線程同時處理成百上千的鏈路,性能上無法支撐,即使NIO線程的CPU負荷達到100%,也無法完全處理消息

(2)當NIO線程負載過重后,處理速度會變慢,會導致大量客戶端連接超時,超時之后往往會重發(fā),更加重了NIO線程的負載。

(3)可靠性低,一個線程意外死循環(huán),會導致整個通信系統(tǒng)不可用。

為了解決這些問題,出現(xiàn)了Reactor多線程模型。

2.Reactor多線程模型:

Java中netty線程模型的案例分析

相比上一種模式,該模型在處理鏈部分采用了多線程(線程池)。

在絕大多數(shù)場景下,該模型都能滿足性能需求。但是,在一些特殊的應(yīng)用場景下,如服務(wù)器會對客戶端的握手消息進行安全認證。這類場景下,單獨的一個Acceptor線程可能會存在性能不足的問題。為了解決這些問題,產(chǎn)生了第三種Reactor線程模型。

3.Reactor主從模型

Java中netty線程模型的案例分析

該模型相比第二種模型,是將Reactor分成兩部分,mainReactor負責監(jiān)聽server socket,accept新連接;并將建立的socket分派給subReactor。subReactor負責多路分離已連接的socket,讀寫網(wǎng)絡(luò)數(shù)據(jù),對業(yè)務(wù)處理功能,其扔給worker線程池完成。通常,subReactor個數(shù)上可與CPU個數(shù)等同。

2.3 Netty模型

2.2中說完了Reactor的三種模型,那么Netty是哪一種呢?其實Netty的線程模型是Reactor模型的變種,那就是去掉線程池的第三種形式的變種,這也是Netty NIO的默認模式。Netty中Reactor模式的參與者主要有下面一些組件:

(1)Selector

(2)EventLoopGroup/EventLoop

(3)ChannelPipeline

Selector即為NIO中提供的SelectableChannel多路復(fù)用器,充當著demultiplexer的角色,這里不再贅述;下面對另外兩種功能和其在Netty之Reactor模式中扮演的角色進行介紹。

三、EventLoopGroup/EventLoop

當系統(tǒng)在運行過程中,如果頻繁的進行線程上下文切換,會帶來額外的性能損耗。多線程并發(fā)執(zhí)行某個業(yè)務(wù)流程,業(yè)務(wù)開發(fā)者還需要時刻對線程安全保持警惕,哪些數(shù)據(jù)可能會被并發(fā)修改,如何保護?這不僅降低了開發(fā)效率,也會帶來額外的性能損耗。

為了解決上述問題,Netty采用了串行化設(shè)計理念,從消息的讀取、編碼以及后續(xù)Handler的執(zhí)行,始終都由IO線程EventLoop負責,這就意外著整個流程不會進行線程上下文的切換,數(shù)據(jù)也不會面臨被并發(fā)修改的風險。這也解釋了為什么Netty線程模型去掉了Reactor主從模型中線程池。

EventLoopGroup是一組EventLoop的抽象,EventLoopGroup提供next接口,可以總一組EventLoop里面按照一定規(guī)則獲取其中一個EventLoop來處理任務(wù),對于EventLoopGroup這里需要了解的是在Netty中,在Netty服務(wù)器編程中我們需要BossEventLoopGroup和WorkerEventLoopGroup兩個EventLoopGroup來進行工作。通常一個服務(wù)端口即一個ServerSocketChannel對應(yīng)一個Selector和一個EventLoop線程,也就是說BossEventLoopGroup的線程數(shù)參數(shù)為1。BossEventLoop負責接收客戶端的連接并將SocketChannel交給WorkerEventLoopGroup來進行IO處理。

EventLoop的實現(xiàn)充當Reactor模式中的分發(fā)(Dispatcher)的角色。

四、ChannelPipeline

ChannelPipeline其實是擔任著Reactor模式中的請求處理器這個角色。

ChannelPipeline的默認實現(xiàn)是DefaultChannelPipeline,DefaultChannelPipeline本身維護著一個用戶不可見的tail和head的ChannelHandler,他們分別位于鏈表隊列的頭部和尾部。tail在更上層的部分,而head在靠近網(wǎng)絡(luò)層的方向。在Netty中關(guān)于ChannelHandler有兩個重要的接口,ChannelInBoundHandler和ChannelOutBoundHandler。inbound可以理解為網(wǎng)絡(luò)數(shù)據(jù)從外部流向系統(tǒng)內(nèi)部,而outbound可以理解為網(wǎng)絡(luò)數(shù)據(jù)從系統(tǒng)內(nèi)部流向系統(tǒng)外部。用戶實現(xiàn)的ChannelHandler可以根據(jù)需要實現(xiàn)其中一個或多個接口,將其放入Pipeline中的鏈表隊列中,ChannelPipeline會根據(jù)不同的IO事件類型來找到相應(yīng)的Handler來處理,同時鏈表隊列是責任鏈模式的一種變種,自上而下或自下而上所有滿足事件關(guān)聯(lián)的Handler都會對事件進行處理。

ChannelInBoundHandler對從客戶端發(fā)往服務(wù)器的報文進行處理,一般用來執(zhí)行半包/粘包,解碼,讀取數(shù)據(jù),業(yè)務(wù)處理等;ChannelOutBoundHandler對從服務(wù)器發(fā)往客戶端的報文進行處理,一般用來進行編碼,發(fā)送報文到客戶端。

下圖是對ChannelPipeline執(zhí)行過程的說明:

Java中netty線程模型的案例分析

關(guān)于Pipeline的更多知識可參考:淺談管道模型(Pipeline)

五、Buffer

Netty提供的經(jīng)過擴展的Buffer相對NIO中的有個許多優(yōu)勢,作為數(shù)據(jù)存取非常重要的一塊,我們來看看Netty中的Buffer有什么特點。

1.ByteBuf讀寫指針

在ByteBuffer中,讀寫指針都是position,而在ByteBuf中,讀寫指針分別為readerIndex和writerIndex,直觀看上去ByteBuffer僅用了一個指針就實現(xiàn)了兩個指針的功能,節(jié)省了變量,但是當對于ByteBuffer的讀寫狀態(tài)切換的時候必須要調(diào)用flip方法,而當下一次寫之前,必須要將Buffe中的內(nèi)容讀完,再調(diào)用clear方法。每次讀之前調(diào)用flip,寫之前調(diào)用clear,這樣無疑給開發(fā)帶來了繁瑣的步驟,而且內(nèi)容沒有讀完是不能寫的,這樣非常不靈活。相比之下我們看看ByteBuf,讀的時候僅僅依賴readerIndex指針,寫的時候僅僅依賴writerIndex指針,不需每次讀寫之前調(diào)用對應(yīng)的方法,而且沒有必須一次讀完的限制。

2.零拷貝

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

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

(3)Netty的文件傳輸采用了transferTo方法,它可以直接將文件緩沖區(qū)的數(shù)據(jù)發(fā)送到目標Channel,避免了傳統(tǒng)通過循環(huán)write方式導致的內(nèi)存拷貝問題。

3.引用計數(shù)與池化技術(shù)

在Netty中,每個被申請的Buffer對于Netty來說都可能是很寶貴的資源,因此為了獲得對于內(nèi)存的申請與回收更多的控制權(quán),Netty自己根據(jù)引用計數(shù)法去實現(xiàn)了內(nèi)存的管理。Netty對于Buffer的使用都是基于直接內(nèi)存(DirectBuffer)實現(xiàn)的,大大提高I/O操作的效率,然而DirectBuffer和HeapBuffer相比之下除了I/O操作效率高之外還有一個天生的缺點,即對于DirectBuffer的申請相比HeapBuffer效率更低,因此Netty結(jié)合引用計數(shù)實現(xiàn)了PolledBuffer,即池化的用法,當引用計數(shù)等于0的時候,Netty將Buffer回收致池中,在下一次申請Buffer的沒某個時刻會被復(fù)用。

總結(jié)

Netty其實本質(zhì)上就是Reactor模式的實現(xiàn),Selector作為多路復(fù)用器,EventLoop作為轉(zhuǎn)發(fā)器,Pipeline作為事件處理器。但是和一般的Reactor不同的是,Netty使用串行化實現(xiàn),并在Pipeline中使用了責任鏈模式。

Netty中的buffer相對有NIO中的buffer又做了一些優(yōu)化,大大提高了性能。

感謝各位的閱讀!看完上述內(nèi)容,你們對Java中netty線程模型的案例分析大概了解了嗎?希望文章內(nèi)容對大家有所幫助。如果想了解更多相關(guān)文章內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

網(wǎng)站標題:Java中netty線程模型的案例分析-創(chuàng)新互聯(lián)
網(wǎng)頁路徑:http://aaarwkj.com/article36/ispsg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供軟件開發(fā)、商城網(wǎng)站Google、App開發(fā)、微信公眾號、域名注冊

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

綿陽服務(wù)器托管
日韩欧美性生活免费观看| 在线观看不卡的黄色地址| 亚洲精品色婷婷一区二区| 亚洲综合日韩丝袜人妻| av天堂五月在线观看| 久久精品资源综合网| 日韩夫妻性生活免费视频| 人妻艳情一区二区三区| 又黄又爽又刺激的性视频| 国产中文精品字幕a区| 成人中文字幕日韩电影| 女厕所偷拍一区二区三区| 色综合亚洲一区二区小说| 日韩av不卡免费播放| 亚洲麻豆精品午夜免费| 成人国产在线欧美精品| 国产内射一级一片高清视频观看 | 亚洲毛片在线免费播放| 亚洲国产精品综合色在线| 亚洲精品国产av成人网| 亚洲一区在线观看激情| 在线看黄色片播放器日韩| 午夜免费视频观看在线| 久久精品国产av一一区| 日韩av亚洲一区二区三区| 91欧美日韩国产在线观看| 国产精品对白久久久久粗| 蜜臀av免费在线观看| 中文字幕亚洲天堂久久| 在线国产偷拍自拍视频| 亚洲第一中文字幕久久| 精品亚洲韩国一区二区三区| 97成品视频在线播放| 国产叼嘿一区二区视频| 老汉av免费在线观看| 日韩人妻一区二区三区蜜桃视频密| 亚洲欧美精品福利在线| 日韩精品电影一区在线观看| 好看的中文字幕人妻少妇| 日本中文字幕免费一区| 91桃色午夜福利视频|