日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java nio proactor_reactor模式与java nio

發(fā)布時間:2024/4/14 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java nio proactor_reactor模式与java nio 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.



Reactor是由Schmidt, Douglas C提出的一種模式,在高并發(fā)服務器實現(xiàn)中廣泛采用。改模式采用事件驅動方式,當事件出現(xiàn)時,后調用相應的事件處理代碼(Event Handler)。

這個模式是高并發(fā)服務器的基礎,如nginx和lighttpd。這兩種對大并發(fā),但每個請求處理都很快的場景非常適合。通常的web訪問就是這個特點。

結構

包括了5個部分,其中handle和Synchronous Event Demultiplexer有OS實現(xiàn)。

Handles:

就是網絡連接(connection),每個網絡連接都由一個handle表示。

Event(事件)

ACCEPT_EVENT:表示收到連接請求

READ_EVENT:表示收到數據

WRITE_EVENT:表示socket可以足夠的緩沖區(qū),可以向其寫入數據。

TIMEOUT_EVENT:超時。Java NIO不支持這個事件。

SIGNAL_EVENT:信號。Java NIO不支持這個事件。

CLOSE_EVENT:該socket被關閉。Java NIO不支持這個事件。

Event Handler

事件處理代碼,該對象實例(instance)是和handle關聯(lián)的。每個Event Handler處理一個handle上的事件。一般的服務器中至少有兩種事件處理代碼:一個是用來接收連接請求(accept event handler),響應ACCEPT_EVENT。,一個用來處理接受的請求(connection event handler),響應READ_EVENT和WRITE_EVENT。

Synchronous Event Demultiplexer(事件多路分離系統(tǒng))

該模式的核心,等待handles上的事件。沒有事件出現(xiàn)時,一直阻塞(blocking);當某個(某些)handles上有時間產生時,返回。這個是實現(xiàn)一般由操作系統(tǒng)提供,如linux的select、poll及epoll等。

Initiation Dispatcher

該對象負責管理Event Handlers(增加,刪除等),當某個handle上有事件出現(xiàn)時,調用相應的

內部使用Synchronous Event Demultiplexer

reactor的論文中給出了實例代碼

Logging_Acceptor是處理接收請求的event handler。

Logging_Handler是處理實際請求的event handler

Initiation_Dispatcher::instance是單利模式的Initiation Dispatcher

線程模型

論文中使用的是單線程模型,即一個線程同時處理接受請求和處理請求。該模型中,如果每個請求的處理時間較長,則會影響真?zhèn)€系統(tǒng)的吞吐率。

更為普遍的是使用多線程模型。多線程的基本方式是1:n。

1個線程用來接受連接請求,執(zhí)行accept event handler。

其他的線程用來處理連接請求,執(zhí)行connection event handler。n的數量可以根據運行情況動態(tài)調整。如果每個連接的處理非常快,可能一個線程就夠了;如果處理的時間很長,則可能一個連接就要有一個線程。

java NIO

java nio就是依照reactor模式設計的。java nio中的主要抽象:

Selector:相當于Synchronous Event Demultiplexer

SelectionKey: 相當于event,和一個SocketChannel關聯(lián)

SocketChannel:相當于handle

java nio中沒有提供initial dispatcher的抽象,這部分功能需要用戶自行實現(xiàn)。

java nio中沒有提供event handler的抽象,這部分功能需要用戶自行實現(xiàn)。

netty

作為API,java nio不會設計的很全面,只會提供基本的功能。對一般的用戶來說,java nio提供的編程界面還是比較原始(pirmitive),不是很容易使用。netty是一個網絡編程框架,在java nio的基礎上提供了更高層的抽象。netty的編程比起nio有極大的簡化。netty中提供了reactor的所有封裝,用戶在使用中只需實現(xiàn)event handler即可。

netty在event handler上又提供了一層抽象,ChannelPipeline和ChannelHandler。

ChannelPipeline類似于原來的event handler,用來處理連接請求。ChannelPipeline由若干個ChannelHandler構成,ChannelPipeline會分別調用這些ChannelHandler來處理連接請求。這種設計類似于servlet中的filter chain。所有的ChannelHandler和在一起,形成了處理鏈路。

netty同樣提供了對線程模型的支持,具體可以參考netty的文檔。

proactor和reactor的區(qū)別

主要區(qū)別是在處理連接請求時的方式:

reactor: 收到事件后,同步處理。該請求沒有完成后,該線程不會再去處理其他請求。

proactor:收到事件,異步處理。該請求會執(zhí)行異步調用(如異步讀寫文件等),然后該請求調用返回,該線程會繼續(xù)執(zhí)行其他的請求。但是第一個請求并沒有處理完畢,當異步操作完成時,后有時間通知到第一個請求,完成處理。proactor的編程會比較復雜。

原文:http://blog.csdn.net/zhengleiguo/article/details/30829583

總結

以上是生活随笔為你收集整理的java nio proactor_reactor模式与java nio的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。