Reactor線程模型
- Reactor單線程模型
所有的I/O操作都由同一個(gè)NIO線程完成蒜危。只適合小容量應(yīng)用場(chǎng)景睹耐。不適合高負(fù)載大并發(fā)的應(yīng)用場(chǎng)景。原因如下:
a占拍、 一個(gè)NIO線程同時(shí)處理成百上千條線路捎迫,性能上無法支撐,即使CPU使用率達(dá)到百分之百贝次,也無法滿足海量消息編解碼彰导、讀取、發(fā)送山析。
b掏父、 當(dāng)NIO線程負(fù)載過重后,處理會(huì)變慢爵政,導(dǎo)致大量客戶端連接超時(shí),而超時(shí)可能重發(fā)钾挟,導(dǎo)致越來越積壓嚴(yán)重。
c徽千、 可靠性問題汤锨,一旦NIO線程跑飛了或者進(jìn)入死循環(huán),整個(gè)系統(tǒng)通信都不可用了泥畅,造成單點(diǎn)故障位仁。 - Reactor多線程模型
由一組NIO線程來處理I/O操作。特點(diǎn)如下:
a钧嘶、 有專門一個(gè)NIO線程--Acceptor線程用來監(jiān)聽服務(wù)端,接收客戶端的TCP連接請(qǐng)求有决。
b空盼、 網(wǎng)絡(luò)IO操作--讀寫等由一個(gè)NIO線程池負(fù)責(zé),線程池可以采用標(biāo)準(zhǔn)的JDK線程池實(shí)現(xiàn)台汇,它包含一個(gè)任務(wù)隊(duì)列和N個(gè)可用的線程篱瞎,由這些NIO線程來完成消息的讀取、發(fā)送和編解碼操作牵素。
c澄者、 一個(gè)NIO線程可以同時(shí)處理N條鏈路请琳。但是同一個(gè)鏈路只對(duì)應(yīng)一個(gè)NIO線程单起,防止發(fā)生并發(fā)操作問題抱怔。
在絕大多數(shù)場(chǎng)景下,Reactor多線程模型可以滿足性能要求局冰。但是康二,個(gè)別特殊場(chǎng)景中勇蝙,一個(gè)NIO線程負(fù)責(zé)監(jiān)聽和處理所有的客戶端連接可能會(huì)存在性能問題。例如并發(fā)百萬客戶端連接味混,或者服務(wù)端需要對(duì)客戶端握手進(jìn)行安全認(rèn)證,但是認(rèn)證本身非常損耗性能蔓挖。 - 主從Reactor多線程模型
特點(diǎn)是:服務(wù)端用來接收客戶端連接的不再是一個(gè)單獨(dú)的NIO線程瘟判,而是一個(gè)獨(dú)立的NIO線程池角溃。Acceptor接收到客戶端TCP連接請(qǐng)求并處理完成后,將新創(chuàng)建的SocketChannel注冊(cè)到IO線程池的某個(gè)IO線程上减细,由它負(fù)責(zé)SocketChanel的讀寫和編解碼操作邪财。Acceptor線程池僅僅用于客戶端的登錄、握手和安全認(rèn)證糠馆,一旦鏈路創(chuàng)建成功怎憋,就將鏈路注冊(cè)到后端的線程池中的Io線程上九昧,有IO線程負(fù)責(zé)后續(xù)的操作毕匀。