NIO是非阻塞IO,而Reactor是基于NIO的一種設(shè)計(jì)模式。NIO是一種模型,一種思想,使用NIO實(shí)現(xiàn)。下面看Reactor模型具體設(shè)計(jì)。
網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)!專(zhuān)注于網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開(kāi)發(fā)、小程序制作、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶(hù)創(chuàng)新互聯(lián)還提供了定襄免費(fèi)建站歡迎大家使用!單 Reactor 單線(xiàn)程模式缺點(diǎn):
當(dāng)其中某個(gè) handler 阻塞時(shí), 會(huì)導(dǎo)致其他所有的 client 的 handler 都得不到執(zhí)行, 并且更嚴(yán)重的是, handler 的阻塞也會(huì)導(dǎo)致整個(gè)服務(wù)不能接收新的 client 請(qǐng)求(因?yàn)?acceptor 也被阻塞了)。不能充分利用多核資源。
一個(gè)線(xiàn)程負(fù)載過(guò)重后,處理速度將變慢,這會(huì)導(dǎo)致大量客戶(hù)端連接超時(shí),超時(shí)之后往往會(huì)進(jìn)行重發(fā),這更加重了 NIO 線(xiàn)程的負(fù)載,最終會(huì)導(dǎo)致大量消息積壓和處理超時(shí),成為系統(tǒng)的性能瓶頸。
一旦 NIO 線(xiàn)程意外跑飛,或者進(jìn)入死循環(huán),會(huì)導(dǎo)致整個(gè)系統(tǒng)通信模塊不可用,不能接收和處理外部消息,造成節(jié)點(diǎn)故障。
添加了一個(gè)工作者線(xiàn)程池,并將非 I/O 操作從 Reactor線(xiàn)程中移出轉(zhuǎn)交給工作者線(xiàn)程池來(lái)執(zhí)行。這樣能夠提高 Reactor 線(xiàn)程的 I/O 響應(yīng),不至于因?yàn)橐恍┖臅r(shí)的業(yè)務(wù)邏輯而延遲對(duì)后面 I/O 請(qǐng)求的處理。主要是將業(yè)務(wù)邏輯處理單獨(dú)分出來(lái)線(xiàn)程執(zhí)行,避免業(yè)務(wù)邏輯處理影響了I/O操作效率。
Reactor 線(xiàn)程池中的每一 Reactor 線(xiàn)程都會(huì)有自己的 Selector、線(xiàn)程和分發(fā)的事件循環(huán)邏
輯。mainReactor 可以只有一個(gè),但 subReactor 一般會(huì)有多個(gè)。mainReactor 線(xiàn)程主要負(fù)責(zé)接收客戶(hù)端的連接請(qǐng)求,然后將接收到的 SocketChannel 傳遞給 subReactor,由 subReactor 來(lái)完成和客戶(hù)端的通信。
觀察者模式也可以稱(chēng)為為 發(fā)布-訂閱 模式,主要適用于多個(gè)對(duì)象依賴(lài)某一個(gè)對(duì)象的狀態(tài)并,當(dāng)某對(duì)象狀態(tài)發(fā)生改變時(shí),要通知其他依賴(lài)對(duì)象做出更新。是一種一對(duì)多的關(guān)系。當(dāng)然,如果依
賴(lài)的對(duì)象只有一個(gè)時(shí),也是一種特殊的一對(duì)一關(guān)系。通常,觀察者模式適用于消息事件處理,
監(jiān)聽(tīng)者監(jiān)聽(tīng)到事件時(shí)通知事件處理者對(duì)事件進(jìn)行處理(這一點(diǎn)上面有點(diǎn)像是回調(diào),容易與反
應(yīng)器模式和前攝器模式的回調(diào)搞混淆)。
reactor 模式,即反應(yīng)器模式,是一種高效的異步 IO 模式,特征是回調(diào),當(dāng) IO 完成時(shí),回調(diào)對(duì)應(yīng)的函數(shù)進(jìn)行處理。這種模式并非是真正的異步,而是運(yùn)用了異步的思想,當(dāng) IO 事件觸發(fā)時(shí),通知應(yīng)用程序作出 IO 處理。模式本身并不調(diào)用系統(tǒng)的異步 IO 函數(shù)。
reactor 模式與觀察者模式有點(diǎn)像。不過(guò),觀察者模式與單個(gè)事件源關(guān)聯(lián),而反應(yīng)器模式則與多個(gè)事件源關(guān)聯(lián) 。當(dāng)一個(gè)主體發(fā)生改變時(shí),所有依屬體都得到通知。
應(yīng)用場(chǎng)景Reactor模型通常用于網(wǎng)絡(luò)模型中,進(jìn)行連接、讀操作、寫(xiě)操作且并發(fā)量高的服務(wù)中去進(jìn)行I/O事件時(shí)使用。例如在redis中、nginx中,都使用了Reactor模型來(lái)實(shí)現(xiàn)客戶(hù)端連接服務(wù)、讀寫(xiě)數(shù)據(jù)的網(wǎng)絡(luò)模型。當(dāng)我們自己提供了一個(gè)服務(wù),且有大量客戶(hù)端與我們提供的服務(wù)進(jìn)行I/O操作時(shí),可以考慮使用Reactor模型進(jìn)行I/O多路復(fù)用,來(lái)提高服務(wù)的I/O性能。
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧