java nio proactor_reactor模式与java nio
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的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java basic类似的地方_java
- 下一篇: java实现js取反_特定位取反(js实