
上篇介紹了單服務(wù)器高性能的 PPC 和 TPC 模式,它們的優(yōu)點(diǎn)是實(shí)現(xiàn)簡(jiǎn)單,缺點(diǎn)是都無(wú)法支撐高并發(fā)的場(chǎng)景,尤其是互聯(lián)網(wǎng)發(fā)展到現(xiàn)在,各種海量用戶業(yè)務(wù)的出現(xiàn),PPC 和 TPC 完全無(wú)能為力。今天我將介紹可以應(yīng)對(duì)高并發(fā)場(chǎng)景的單服務(wù)器高性能架構(gòu)模式:Reactor 和 Proactor。
Reactor
PPC 模式最主要的問(wèn)題就是每個(gè)連接都要?jiǎng)?chuàng)建進(jìn)程(為了描述簡(jiǎn)潔,這里只以 PPC 和進(jìn)程為例,實(shí)際上換成 TPC 和線程,原理是一樣的),連接結(jié)束后進(jìn)程就銷毀了,這樣做其實(shí)是很大的浪費(fèi)。為了解決這個(gè)問(wèn)題,一個(gè)自然而然的想法就是資源復(fù)用,即不再單獨(dú)為每個(gè)連接創(chuàng)建進(jìn)程,而是創(chuàng)建一個(gè)進(jìn)程池,將連接分配給進(jìn)程,一個(gè)進(jìn)程可以處理多個(gè)連接的業(yè)務(wù)。
引入資源池的處理方式后,會(huì)引出一個(gè)新的問(wèn)題:進(jìn)程如何才能高效地處理多個(gè)連接的業(yè)務(wù)?當(dāng)一個(gè)連接一個(gè)進(jìn)程時(shí),進(jìn)程可以采用“read -> 業(yè)務(wù)處理 -> write”的處理流程,如果當(dāng)前連接沒有數(shù)據(jù)可以讀,則進(jìn)程就阻塞在 read 操作上。這種阻塞的方式在一個(gè)連接一個(gè)進(jìn)程的場(chǎng)景下沒有問(wèn)題,但如果一個(gè)進(jìn)程處理多個(gè)連接,進(jìn)程阻塞在某個(gè)連接的 read 操作上,此時(shí)即使其他連接有數(shù)據(jù)可讀,進(jìn)程也無(wú)法去處理,很顯然這樣是無(wú)法做到高性能的。
解決這個(gè)問(wèn)題的最簡(jiǎn)單的方式是將 read 操作改為非阻塞,然后進(jìn)程不斷地輪詢多個(gè)連接。這種方式能夠解決阻塞的問(wèn)題,但解決的方式并不優(yōu)雅。首先,輪詢是要消耗 CPU 的;其次,如果一個(gè)進(jìn)程處理幾千上萬(wàn)的連接,則輪詢的效率是很低的。
為了能夠更好地解決上述問(wèn)題,很容易可以想到,只有當(dāng)連接上有數(shù)據(jù)的時(shí)候進(jìn)程才去處理,這就是 I/O 多路復(fù)用技術(shù)的來(lái)源。
I/O 多路復(fù)用技術(shù)歸納起來(lái)有兩個(gè)關(guān)鍵實(shí)現(xiàn)點(diǎn):文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-823012.html
- 當(dāng)多條連接共用一個(gè)阻塞對(duì)象后,進(jìn)程只需要在一個(gè)阻塞對(duì)象上等待,而無(wú)須再輪詢所有連接,常見的實(shí)現(xiàn)方式有 select、epoll、kqueue 等。
- 當(dāng)某條連接有新的數(shù)據(jù)可以處理時(shí),操作系統(tǒng)會(huì)通知進(jìn)程,進(jìn)程從阻塞狀態(tài)返回,開始進(jìn)行業(yè)務(wù)處理。
I/O 多路復(fù)用結(jié)合線程池,完美地解決了 PPC 和 TPC 的問(wèn)題,而且“大神們”給它取了一個(gè)很牛的名字:Reactor,中文是“反應(yīng)堆”。聯(lián)想到“核反應(yīng)堆”,聽起來(lái)就很嚇人,實(shí)際上這里的“反應(yīng)”不是聚變、文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-823012.html
到了這里,關(guān)于架構(gòu)篇19:?jiǎn)畏?wù)器高性能模式-Reactor與Proactor的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!