基于IO多路復(fù)用的Reactor模式

綜述

react vi.反應(yīng),影響; reactor n.反應(yīng)器;reactor是網(wǎng)絡(luò)編程中的一種設(shè)計(jì)模式。使用reactor模式可以實(shí)現(xiàn)高性能的IO,Netty和Redis的IO模式就是實(shí)現(xiàn)了reactor模式來實(shí)現(xiàn)高性能并發(fā)的。同時(shí)reactor模式也是23種設(shè)計(jì)模式的一種。
網(wǎng)絡(luò)編程模型經(jīng)歷了從單線程->多線程->線程池->reactor模式,單線程到多線程是要依賴于底層多個(gè)CPU的硬件技術(shù)發(fā)展的支持,線程池則減少了多線程中的線程不斷的創(chuàng)建和銷毀所消耗的資源,reactor模式則是把處理socket的粒度做了細(xì)分,來解決高性能的并發(fā)請求。


// 單線程模式,無法并發(fā),如果當(dāng)前的請求沒有處理完,那么后面的請求只能被阻塞,服務(wù)器的吞吐量太低。
while(true){
    socket = accept();
    handle(socket);
}

// 多線程模式,connection per thread,每一個(gè)連接用一個(gè)線程處理。
while(true){
    socket = accept();
    new Thread(socket);
}

// 線程池模式,減少了線程的反復(fù)創(chuàng)建和銷毀,但本質(zhì)上一個(gè)線程還是要完整的處理連接、讀取、寫入
while(true){
    socket = accept();
    ExecutorService executorService = Executors.newCachedThreadPool();
    executorService.execute(new Thread(socket));
}

// reactor模式(基于IO多路復(fù)用的技術(shù))
1. java nio的select函數(shù),可以同時(shí)監(jiān)聽多個(gè)套接字socket。每個(gè)socket都會關(guān)聯(lián)連接event、讀取event、回寫event。
2. 把一個(gè)線程拆分成更小的粒度:建立連接的handler、讀取數(shù)據(jù)的handler、回寫數(shù)據(jù)的hander。handler處理完event就丟給下一個(gè)handler處理,自己又可以去服務(wù)socket,提高了復(fù)用率,提高了系統(tǒng)的吞吐量。

基本上所有的網(wǎng)絡(luò)處理程序都有以下基本的處理過程: Read request->Decode request->Process service->Encode reply->Send reply。

image.png
image.png

在單核機(jī)器上,多線程并不一定能提高系統(tǒng)性能,除非有一些阻塞情況發(fā)生,否則線程上下文切換的開銷會使處理速度變慢。舉個(gè)生動的例子,一個(gè)人削蘋果和切西瓜(一件一件的做)。一個(gè)人削蘋果和燒一壺開水(一邊燒水一邊把蘋果削了);

餐廳點(diǎn)餐來理解reactor模式

image.png

上面這個(gè)圖,是多線程方式。每個(gè)顧客都有自己的服務(wù)團(tuán)隊(duì)(線程),在人少的情況下是可以良好的運(yùn)作的??梢园l(fā)現(xiàn)其實(shí)服務(wù)員并不是一直在干活的,大部分時(shí)間他們只是站在餐桌旁邊等客人點(diǎn)菜。于是老板就對服務(wù)員說,客人點(diǎn)菜的時(shí)候你們就別傻站著了,先去服務(wù)其它客人,有客人點(diǎn)好的時(shí)候喊你們再過去。

image.png

老板發(fā)現(xiàn)根本不需要那么多的服務(wù)員,于是裁了一波員,最終甚至可以只有一個(gè)服務(wù)員。這就是 Reactor 模式的核心思想:減少等待。當(dāng)遇到需要等待 IO 時(shí),先釋放資源,而在 IO 完成時(shí),再通過事件驅(qū)動 (event driven) 的方式,繼續(xù)接下來的處理。從整體上減少了資源的消耗。

三種reactor線程模型

無論是C++還是Java編寫的網(wǎng)絡(luò)框架,大多數(shù)都是基于Reactor模式進(jìn)行設(shè)計(jì)和開發(fā),Reactor模式基于事件驅(qū)動,特別適合處理海量的I/O事件。Reactor三種線程模型:單線程模型、多線程模型、主從線程模型。

image.png
image.png
image.png

代碼參考

參考

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容