什么是Reactor線程模型史煎?
無(wú)論是 C++ 還是 Java 編寫的網(wǎng)絡(luò)框架,大多數(shù)都是基于 Reactor 模式進(jìn)行設(shè)計(jì)和開發(fā)驳糯,Reactor 模式基于事件驅(qū)動(dòng)篇梭,特別適合處理海量的 I/O 事件。
The reactor design pattern is an event handling pattern for handling service requests delivered concurrently to a service handler by one or more inputs. The service handler then demultiplexes the incoming requests and dispatches them synchronously to the associated request handlers.
Reactor線程模型的基本思想是:分而治之 + 事件驅(qū)動(dòng)
- 一個(gè)連接里完整的網(wǎng)絡(luò)處理過程一般分為accept酝枢、read恬偷、decode、process帘睦、encode袍患、send這幾個(gè)步驟。Reactor將每個(gè)步驟抽象成一個(gè)網(wǎng)絡(luò)事件(Task)
- 當(dāng)每個(gè)Task就緒時(shí)竣付,Reactor會(huì)收到網(wǎng)絡(luò)通知诡延,會(huì)把Task交給綁定了相應(yīng)Task的Handler執(zhí)行。
Reactor模型的核心結(jié)構(gòu)
- Reactor:響應(yīng)器卑笨,負(fù)責(zé)響應(yīng)事件
- Handler:處理器孕暇,負(fù)責(zé)處理事件
- Accepror:接收器仑撞,是事件處理器的一種赤兴,綁定了connect事件。當(dāng)客戶端發(fā)起connect操作時(shí)隧哮,Reactor會(huì)把connect事件桶良,交給Acceptor處理。
Reactor模型
- 單線程模型
- 多線程模型
- 主從多線程模型
優(yōu)點(diǎn):不需要并發(fā)控制沮翔,減少了上下文的切換
缺點(diǎn):不能使用多核CPU陨帆。一個(gè)線程需要處理所有網(wǎng)絡(luò)時(shí)間,當(dāng)并發(fā)量比較大的時(shí)候,難堪重負(fù)疲牵。
- 有一個(gè)Reactor線程承二,用于監(jiān)聽服務(wù)端ServerSocketChannel,接收客戶端的TCP連接請(qǐng)求纲爸。連接建立以后亥鸠,會(huì)把socketChannel注冊(cè)到worker thread中的selector上。
-
IO讀寫事件识啦,由一個(gè)線程池worker Thread Pool執(zhí)行负蚊。(讓reactor模型更專注)
這種模型使用了一個(gè)線程池reactor thread poll,這樣就可以監(jiān)聽多個(gè)端口颓哮。
netty的線程模型與Reactor主從多線程模型類似家妆,有兩個(gè)線程池
bossGroup:如果只有一個(gè)服務(wù)器端口需要監(jiān)聽,則線程數(shù)量設(shè)置為1 冕茅。
workerGroup
通過上圖可知伤极,無(wú)論是哪個(gè)線程池,一個(gè)線程抽象為一個(gè)NioEventLoop姨伤,這是一個(gè)不斷循環(huán)執(zhí)行處理任務(wù)的線程塑荒,每個(gè)NioEventLoop有一個(gè)selector,用于監(jiān)聽綁定在其上的socket鏈路姜挺。
什么是EventLoop齿税?
Will handle all the I/O operations for a {@link Channel} once registered.
One {@link EventLoop} instance will usually handle more than one {@link Channel} but this may depend on implementation details and internals.
每個(gè)NioEventLoop中包含有一個(gè)Selector,一個(gè)taskQueue炊豪,一個(gè)delayedTaskQueue
- 串行化設(shè)計(jì):一個(gè)EventLoop可以處理多個(gè)Channel凌箕,是一對(duì)多的關(guān)系。
- 定時(shí)任務(wù)與事件輪:
感謝:
netty學(xué)習(xí)系列二:NIO Reactor模型 & Netty線程模型
NIO系列——之Reactor模型
20190808
再度這篇文章词渤,發(fā)現(xiàn)自己好多看不懂牵舱。
每學(xué)習(xí)一個(gè)點(diǎn),總得想想下面幾個(gè)問題缺虐,大概就能厘清問題:
- 該技術(shù)在什么場(chǎng)景下會(huì)出現(xiàn)芜壁?用來(lái)解決什么問題?
- 空間結(jié)構(gòu)是什么高氮?時(shí)間流程是什么慧妄?
有不明白的一點(diǎn)一點(diǎn)扣,比如java.nio.channels.SelectionKey#OP_READ
參考:https://blog.51cto.com/stevex/1581934