您好,登錄后才能下訂單哦!
這篇文章主要為大家展示了“什么是Reactor模式”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“什么是Reactor模式”這篇文章吧。
Reactor模式一般翻譯成"反應器模式",也有人稱為"分發者模式"。它是將客戶端請求提交到一個或者多個服務處理程序的設計模式。工作原理是由一個線程來接收所有的請求,然后派發這些請求到相關的工作線程中。
在java中,沒有NIO出現之前都是使用socket編程。socket的接收請求是阻塞的,需要處理完一個請求才能處理下一個請求,所以在面對高并發的服務請求時,性能就會很差。
那有人就會說使用多線程(如下圖所示)。接收到一個請求,就創建一個線程處理,這樣就不會阻塞了。實際上這樣的確是可以在提升性能上起到一定的作用,但是當請求很多的時候,就會創建大量的線程,維護線程需要資源的消耗,線程之間的切換也需要消耗性能。而且系統創建線程的數量也是有限的,所以當高并發時,會直接把系統拖垮。由于以上的問題,提出了Reactor模式。
基于Java,Doug Lea(Java并發包作者)提出了三種形式,單Reactor單線程,單Reactor多線程和多Reactor多線程。
在介紹三種Reactor模式前,先簡單地說明三個角色:
Reactor
:負責響應事件,將事件分發到綁定了對應事件的Handler,如果是連接事件,則分發到Acceptor。Handler
:事件處理器。負責執行對應事件對應的業務邏輯。Acceptor
:綁定了 connect 事件,當客戶端發起connect請求時,Reactor會將accept事件分發給Acceptor處理。
只有一個
select
循環接收請求,客戶端(client)注冊進來由Reactor
接收注冊事件,然后再由reactor分發(dispatch)出去,由下面的處理器(Handler)去處理。
一個餐廳里只有一個既是前臺也是服務員的人,負責接待客人,也負責把客人點的菜下達給廚師。
單線程的問題實際上是很明顯的。只要其中一個Handler方法阻塞了,那就會導致所有的client的Handler都被阻塞了,也會導致注冊事件也無法處理,無法接收新的請求。所以這種模式用的比較少,因為不能充分利用到多核的資源。
這種模式僅僅只能處理Handler比較快速完成的場景。
在多線程Reactor中,注冊接收事件都是由
Reactor
來做,其它的計算,編解碼由一個線程池來做。從圖中可以看出工作線程是多線程的,監聽注冊事件的Reactor
還是單線程。
相當于餐廳里有一個前臺,多個服務員。前臺只負責接待客人,服務員只負責服務客人。
對比單線程Reactor模型,多線程Reactor模式在Handler讀寫處理時,交給工作線程池處理,不會導致Reactor無法執行,因為Reactor分發和Handler處理是分開的,能充分地利用資源。從而提升應用的性能。
缺點:Reactor只在主線程中運行,承擔所有事件的監聽和響應,如果短時間的高并發場景下,依然會造成性能瓶頸。
1、mainReactor負責監聽客戶端請求,專門處理新連接的建立,將建立好的連接注冊到subReactor。
2、subReactor 將分配的連接加入到隊列進行監聽,當有新的事件發生時,會調用連接相對應的Handler進行處理。
相當于餐廳里有多個前臺和多個服務員,前臺只負責接待客人,服務員只負責服務客人。
mainReactor 主要是用來處理客戶端請求連接建立的操作。subReactor主要做和建立起來的連接做數據交互和事件業務處理操作,每個subReactor一個線程來處理。
這樣的模型使得每個模塊更加專一,耦合度更低,能支持更高的并發量。許多框架也使用這種模式,比如接下來要講的Netty框架就采用了這種模式。
Netty可謂是框架中精品中的極品,要用一張圖或者一段話來總結概括不太可能,所以下面我僅分析一下Netty框架的架構模型。在下一篇文章再繼續深入探究Netty。這個架構實際上跟多Reactor多線程模型比較像。
1、BossGroup相當于mainReactor,負責建立連接并且把連接注冊到WorkGroup中。WorkGroup負責處理連接對應的讀寫事件。
2、BossGroup和WorkGroup是兩個線程池,里面有多個NioEventGroup(實際上是線程),默認BossGroup和WorkGroup里的線程數是cpu核數的兩倍(源碼中有體現)。
3、每一個NioEventGroup都是一個無限循環,負責監聽相對應的事件。4、Pipeline(通道)里包含多個ChannelHandler(業務處理),按順序執行。
以上是“什么是Reactor模式”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。