reactor线程模型_从TCP服务器到I/O模型,带你学习Netty
學(xué)習(xí)Netty就不得不從TCP服務(wù)器和I/O模型說(shuō)起,了解TCP服務(wù)器架構(gòu)和I/O模型的演進(jìn)有助于深入了解Netty。
TCP服務(wù)器的架構(gòu)
一般地,TCP服務(wù)器有兩種套接字,監(jiān)聽(tīng)套接字和已連接套接字。監(jiān)聽(tīng)套接字用于TCP的監(jiān)聽(tīng),一旦連接建立便產(chǎn)生已連接套接字,服務(wù)器利用已連接套接字與客戶端進(jìn)行通信。
- 迭代服務(wù)器
- 在迭代服務(wù)器中,監(jiān)聽(tīng)套接字會(huì)一直阻塞直到能夠接受連接,接受連接后利用已連接套接字與客戶端通信,這些工作都是在同一個(gè)線程中完成的,示意Java代碼如下。這種模式是串行處理,很難應(yīng)對(duì)并發(fā)量較大的情況。
- 并發(fā)服務(wù)器
- 在并發(fā)服務(wù)器中,監(jiān)聽(tīng)套接字會(huì)一直阻塞直到能夠接受連接,接受連接后,服務(wù)器會(huì)讓子線程/進(jìn)程去處理已連接套接字,示意Java代碼如下。這種模式雖然是并行處理,可以不干擾服務(wù)端的監(jiān)聽(tīng),但是由于每次新來(lái)一個(gè)請(qǐng)求就會(huì)產(chǎn)生一個(gè)新的線程去處理,出于資源的考慮很難應(yīng)對(duì)高并發(fā)的情況。
- IO多路復(fù)用(事件驅(qū)動(dòng))
- 為了能在一個(gè)線程中處理多個(gè)連接,可以使用IO多路復(fù)用(事件驅(qū)動(dòng)),典型的有Linux C中的select、poll和epoll,Java的Selector類(lèi)等。以Selector為例,調(diào)用者在選擇器上為不同的連接注冊(cè)自己感興趣的事件(可讀/可寫(xiě)/可接受/可連接),然后阻塞在select上,當(dāng)事件發(fā)生時(shí)調(diào)用者便會(huì)得到通知,并且知道是哪個(gè)連接觸發(fā)了事件,以便可以進(jìn)一步處理。
- Selector實(shí)現(xiàn)的HTTP服務(wù)器示意如下:
I/O模型
一個(gè)輸入操作通常包括兩個(gè)不同的階段[1][2]:
(1) 阻塞式I/O模型
(2) 非阻塞式I/O模型
(3) I/O復(fù)用模型
(4) 信號(hào)驅(qū)動(dòng)式I/O模型
(5) 異步I/O模型
同步I/O和異步I/O對(duì)比
POSIX把這兩個(gè)術(shù)語(yǔ)定義如下:
- 同步I/O操作導(dǎo)致請(qǐng)求進(jìn)程阻塞,直至I/O操作完成;
- 異步I/O操作不導(dǎo)致請(qǐng)求進(jìn)程阻塞。
根據(jù)上述定義,前4種模型——阻塞式I/O模型、非阻塞式I/O模型、I/O復(fù)用模型和信號(hào)驅(qū)動(dòng)式I/O模型都是同步I/O模型,因?yàn)槠渲姓嬲腎/O操作(recvfrom)將阻塞進(jìn)程。只有異步I/O模型與POSIX定義的異步I/O相匹配。
Netty
Netty是一款異步的事件驅(qū)動(dòng)的網(wǎng)絡(luò)應(yīng)用編程框架,支持快速地開(kāi)發(fā)可維護(hù)的高性能的面向協(xié)議的服務(wù)器和客戶端。與使用阻塞I/O來(lái)處理大量事件相比,使用非阻塞I/O來(lái)處理更快速、更經(jīng)濟(jì),Netty使用了Reactor模式將業(yè)務(wù)和網(wǎng)絡(luò)邏輯解耦,實(shí)現(xiàn)關(guān)注點(diǎn)分離[3]。
Reactor模式
Reactor模式(反應(yīng)堆模式)是一種處理一個(gè)或多個(gè)客戶端并發(fā)交付服務(wù)請(qǐng)求的事件設(shè)計(jì)模式。當(dāng)請(qǐng)求抵達(dá)后,服務(wù)處理程序使用I/O多路復(fù)用策略,然后同步地派發(fā)這些請(qǐng)求至相關(guān)的請(qǐng)求處理程序[4]。
Reactor模式中的角色:
- Reactor:監(jiān)聽(tīng)端口,響應(yīng)與分發(fā)事件;
- Acceptor:當(dāng)Accept事件到來(lái)時(shí)Reactor將Accept事件分發(fā)給Acceptor,Acceptor將已連接套接字的通道注冊(cè)到Reactor上;
- Handler:已連接套接字做業(yè)務(wù)處理。
單Reactor單線程
在這種模式中,Reactor、Acceptor和Handler都運(yùn)行在一個(gè)線程中。
單Reactor多線程
在這種模式中,Reactor和Acceptor運(yùn)行在同一個(gè)線程,而Handler只有在讀和寫(xiě)階段與Reactor和Acceptor運(yùn)行在同一個(gè)線程,讀寫(xiě)之間對(duì)數(shù)據(jù)的處理會(huì)被Reactor分發(fā)到線程池中。
多Reactor多線程
在這種模式中,主Reactor負(fù)責(zé)監(jiān)聽(tīng),與Acceptor運(yùn)行在同一個(gè)線程,Acceptor會(huì)將已連接套接字的通道注冊(cè)到從Reactor上,從Reactor負(fù)責(zé)響應(yīng)和分發(fā)事件,起到類(lèi)似多線程Reactor的作用。Netty服務(wù)端使用了該種模式。
總結(jié)
以上是生活随笔為你收集整理的reactor线程模型_从TCP服务器到I/O模型,带你学习Netty的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: mfc 找到字符串中字符_利用滑动窗口解
- 下一篇: python中import与input_