日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

什么是Reactor模式

發(fā)布時間:2023/12/19 42 生活家
生活随笔 收集整理的這篇文章主要介紹了 什么是Reactor模式 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

這篇文章主要為大家展示了“什么是Reactor模式”,內(nèi)容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“什么是Reactor模式”這篇文章吧。

思維導(dǎo)圖


思維導(dǎo)圖

一、Reactor模式介紹

1.1 什么是Reactor模式

Reactor模式一般翻譯成"反應(yīng)器模式",也有人稱為"分發(fā)者模式"。它是將客戶端請求提交到一個或者多個服務(wù)處理程序的設(shè)計模式。工作原理是由一個線程來接收所有的請求,然后派發(fā)這些請求到相關(guān)的工作線程中

1.2 為什么使用Reactor模式

在java中,沒有NIO出現(xiàn)之前都是使用socket編程。socket的接收請求是阻塞的,需要處理完一個請求才能處理下一個請求,所以在面對高并發(fā)的服務(wù)請求時,性能就會很差。

那有人就會說使用多線程(如下圖所示)。接收到一個請求,就創(chuàng)建一個線程處理,這樣就不會阻塞了。實際上這樣的確是可以在提升性能上起到一定的作用,但是當(dāng)請求很多的時候,就會創(chuàng)建大量的線程,維護線程需要資源的消耗,線程之間的切換也需要消耗性能。而且系統(tǒng)創(chuàng)建線程的數(shù)量也是有限的,所以當(dāng)高并發(fā)時,會直接把系統(tǒng)拖垮。由于以上的問題,提出了Reactor模式。

基于Java,Doug Lea(Java并發(fā)包作者)提出了三種形式,單Reactor單線程,單Reactor多線程和多Reactor多線程

二、Reactor模式的演進過程

在介紹三種Reactor模式前,先簡單地說明三個角色:

Reactor:負責(zé)響應(yīng)事件,將事件分發(fā)到綁定了對應(yīng)事件的Handler,如果是連接事件,則分發(fā)到Acceptor。Handler:事件處理器。負責(zé)執(zhí)行對應(yīng)事件對應(yīng)的業(yè)務(wù)邏輯。Acceptor:綁定了 connect 事件,當(dāng)客戶端發(fā)起connect請求時,Reactor會將accept事件分發(fā)給Acceptor處理。

2.1 單Reactor單線程


工作流程

只有一個select循環(huán)接收請求,客戶端(client)注冊進來由Reactor接收注冊事件,然后再由reactor分發(fā)(dispatch)出去,由下面的處理器(Handler)去處理。

通俗解釋

一個餐廳里只有一個既是前臺也是服務(wù)員的人,負責(zé)接待客人,也負責(zé)把客人點的菜下達給廚師。

單Reactor單線程的特點

單線程的問題實際上是很明顯的。只要其中一個Handler方法阻塞了,那就會導(dǎo)致所有的client的Handler都被阻塞了,也會導(dǎo)致注冊事件也無法處理,無法接收新的請求。所以這種模式用的比較少,因為不能充分利用到多核的資源。

這種模式僅僅只能處理Handler比較快速完成的場景。

2.2 單Reactor多線程


工作流程

多線程Reactor中,注冊接收事件都是由Reactor來做,其它的計算,編解碼由一個線程池來做。從圖中可以看出工作線程是多線程的,監(jiān)聽注冊事件的Reactor還是單線程。

通俗解釋

相當(dāng)于餐廳里有一個前臺,多個服務(wù)員。前臺只負責(zé)接待客人,服務(wù)員只負責(zé)服務(wù)客人。

單Reactor多線程的特點

對比單線程Reactor模型,多線程Reactor模式在Handler讀寫處理時,交給工作線程池處理,不會導(dǎo)致Reactor無法執(zhí)行,因為Reactor分發(fā)和Handler處理是分開的,能充分地利用資源。從而提升應(yīng)用的性能。

缺點:Reactor只在主線程中運行,承擔(dān)所有事件的監(jiān)聽和響應(yīng),如果短時間的高并發(fā)場景下,依然會造成性能瓶頸。

2.3 多Reactor多線程


工作流程

1、mainReactor負責(zé)監(jiān)聽客戶端請求,專門處理新連接的建立,將建立好的連接注冊到subReactor。

2、subReactor 將分配的連接加入到隊列進行監(jiān)聽,當(dāng)有新的事件發(fā)生時,會調(diào)用連接相對應(yīng)的Handler進行處理。

通俗解釋

相當(dāng)于餐廳里有多個前臺和多個服務(wù)員,前臺只負責(zé)接待客人,服務(wù)員只負責(zé)服務(wù)客人。

多Reactor多線程的特點

mainReactor 主要是用來處理客戶端請求連接建立的操作。subReactor主要做和建立起來的連接做數(shù)據(jù)交互和事件業(yè)務(wù)處理操作,每個subReactor一個線程來處理。

這樣的模型使得每個模塊更加專一,耦合度更低,能支持更高的并發(fā)量。許多框架也使用這種模式,比如接下來要講的Netty框架就采用了這種模式。

三、在Netty中的應(yīng)用

Netty可謂是框架中精品中的極品,要用一張圖或者一段話來總結(jié)概括不太可能,所以下面我僅分析一下Netty框架的架構(gòu)模型。在下一篇文章再繼續(xù)深入探究Netty。這個架構(gòu)實際上跟多Reactor多線程模型比較像。

1、BossGroup相當(dāng)于mainReactor,負責(zé)建立連接并且把連接注冊到WorkGroup中。WorkGroup負責(zé)處理連接對應(yīng)的讀寫事件。

2、BossGroup和WorkGroup是兩個線程池,里面有多個NioEventGroup(實際上是線程),默認(rèn)BossGroup和WorkGroup里的線程數(shù)是cpu核數(shù)的兩倍(源碼中有體現(xiàn))。

3、每一個NioEventGroup都是一個無限循環(huán),負責(zé)監(jiān)聽相對應(yīng)的事件。4、Pipeline(通道)里包含多個ChannelHandler(業(yè)務(wù)處理),按順序執(zhí)行。

總結(jié)

以上是生活随笔為你收集整理的什么是Reactor模式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。