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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

什么是Reactor模式

發(fā)布時間:2023/12/19 综合教程 34 生活家
生活随笔 收集整理的這篇文章主要介紹了 什么是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)建一個線程處理,這樣就不會阻塞了。實(shí)際上這樣的確是可以在提升性能上起到一定的作用,但是當(dāng)請求很多的時候,就會創(chuàng)建大量的線程,維護(hù)線程需要資源的消耗,線程之間的切換也需要消耗性能。而且系統(tǒng)創(chuàng)建線程的數(shù)量也是有限的,所以當(dāng)高并發(fā)時,會直接把系統(tǒng)拖垮。由于以上的問題,提出了Reactor模式。

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

二、Reactor模式的演進(jìn)過程

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

Reactor:負(fù)責(zé)響應(yīng)事件,將事件分發(fā)到綁定了對應(yīng)事件的Handler,如果是連接事件,則分發(fā)到Acceptor。Handler:事件處理器。負(fù)責(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)注冊進(jìn)來由Reactor接收注冊事件,然后再由reactor分發(fā)(dispatch)出去,由下面的處理器(Handler)去處理。

通俗解釋

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

單Reactor單線程的特點(diǎn)

單線程的問題實(shí)際上是很明顯的。只要其中一個Handler方法阻塞了,那就會導(dǎo)致所有的client的Handler都被阻塞了,也會導(dǎo)致注冊事件也無法處理,無法接收新的請求。所以這種模式用的比較少,因?yàn)椴荒艹浞掷玫蕉嗪说馁Y源。

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

2.2 單Reactor多線程


工作流程

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

通俗解釋

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

單Reactor多線程的特點(diǎn)

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

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

2.3 多Reactor多線程


工作流程

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

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

通俗解釋

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

多Reactor多線程的特點(diǎn)

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

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

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

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

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

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

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

總結(jié)

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

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