Java程序员需要了解的两种服务器设计模型
我們在IO模型和Java網絡編程模型中,對IO有了一定的理解。這一篇,主要講解基于事件驅動的兩種是在原來基礎上的擴展。在基于事件驅動的網絡編程模型中,Reactor和Proactor模型是兩種常用的IO設計模型。
我們知道BIO(阻塞IO)只有等待阻塞方法結束了,操作權才會交還給調用線程,在阻塞期間,調用者做不了任何操作,只能等待。在此期間調用者線程無法轉向其他能做的事,對調用者來講,這其實是一種浪費。在NIO(非阻塞IO)中,非阻塞IO會立刻將結果返回到調用者,調用者獲取結果無需等待。獲得的結果無非兩種:數據準備好了,你繼續表演吧;要么數據還沒準備好,你要不再試試,或者你等會再試試。而對AIO(異步IO),調用方立刻獲得返回,并且操作系統會使用另外的資源來達成此次的IO請求,并在操作系統完成數據準備后,通知調用者。
Reactor模式和Proactor模型
Reactor模型的中心思想采用的就是我們在IO模型和Java網絡編程模型中所講的多路復用IO。Reactor模型主要包含以下幾個角色:
1)Handle,也叫句柄,有些地方也叫描述符。如網絡Socket IO中稱網絡IO句柄或者Socket描述符,在文件讀寫中稱文件IO句柄或者文件描述符等。
2)Synchronous Event Demultiplexer,也稱同步事件多路分解器,用于阻塞等待發生在句柄集合上的一個或者多個事件,因為事件的到來是隨機不可預測的,底層要實現事件的監聽采取的是循環等待的策略,這種策略也叫事件循環。事件循環依賴系統調用,這里的系統調用,指的就是select/poll/epol等底層函數。這些底層函數一旦監聽到句柄(或描述符)的讀就緒或者寫就緒,就會通知調用方進行讀寫操作。同步事件分離器依賴底層系統調用的實現。
3)Event Handler, 可稱為事件處理器,不同的事件,可以有不同的處理器。通常IO框架庫會將事件處理器定義成一個模板函數,不同的事件處理器可以有不同的特性,擁有自己業務相關的實現。
4)Reactor,也稱為反應器,反應器主要功能包括以下:注冊或者刪除應用程序所關注的事件句柄,運行事件循環監控事件的到來,當事件到達時,反應器分離事件,并通知到對應的具體的事件處理器上,由具體的事件處理器處理器調用相關的函數來實現數據的讀或者寫,處理完數據后,交還系統的控制權。
Reactor模型圖
整體的業務流可以概括為,首先調用者先向反應器注冊,其對某種具體 的IO動作感興趣,反應器會循環監控調用 者注冊的事件是否已發生(如可讀可寫等),當事件發生后,事件分解器就被喚醒,會通知到事件對應的處理器來完成 事件的讀寫,可以看出,在具體事件到達時,處理程序不是調用的反應器,而是通過反應器分離的事件處理器來作數據的讀或者寫,這種方式又被稱為“好萊塢法則”,類似于好萊塢大導演找演員的模型,你別來找我,等活來了我來找你吧。Reactor模型當有對應的IO完成時,回調對應的函數來處理,這種模型本質上還是一種同步的IO模型,其底層也并沒有調用對應的異步IO的函數。
Reactor模型中的事件處理器是基于模板的模型來實現的,這意味著不同的事件處理器是分離的,業務間具體低侵入性。Reactor模型的底層系統調用也是一個模板模型,可以用select實現,亦或epoll,但是必須滿足能監控活躍連接的功能。
Proactor與Reactor則不同,Reactor是基于同步IO模型實現的,而Proactor是基于異步IO。
Proactor中,調用者會調用異步操作處理器提供的異步函數,調用之后, 調用者線程和異步操作處理器會獨立運行,這依賴于操作系統對異步IO的支持,實際的IO是由操作系統來完成 的。然后Proactor會進行事件循環,等待事件的到來 ,當事件分解器等待事件到來的同時,操作系統已經在同時將目標數據拷備到用戶空間,當拷備完成 后,會通知到事件分解器,事情已經搞完了,事件分解器將完成事件轉發到相應的事件處理者或者 回調函數,調用 者就可以利用這些數據處理自己的業務邏輯 了。
Reactor和Proactor都是對某個具體IO事件的告知,這也就我們所說的基于事件驅動,Reactor是告知的事件已準備好,而Proactor是事件已做好。他們的業務 邏輯也很類似,都是事件分解器來負責IO的監控,并回調對應的事件處理器,不同之處在于Reactor事件告知的是已準備好,還需要進一步的從內核 空間數據拷備到用戶空間。而Proactor是數據已經準備好,調用 者可以直接在用戶空間使用了。
? ? ? ?為了讓學習變得輕松、高效,今天給大家免費分享一套Java入門教學資源。幫助大家在成為Java架構師的道路上披荊斬棘。需要入門的資料歡迎加入學習交流群:9285,05736
總結
以上是生活随笔為你收集整理的Java程序员需要了解的两种服务器设计模型的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java的数据类型及其封装器类
- 下一篇: Java中AJAX工作原理是什么