引子
為了web app而看的nodejs斑胜,對(duì)于nodejs的單線程對(duì)高并發(fā)友好小小煙糾了下鞠抑,分享饭聚,歡迎指正謬誤。搁拙。秒梳。
都說單線程nodejs能減少I/O問題,淘寶team說它是一個(gè)平臺(tái)而不是一種語(yǔ)言箕速,它的單線程是指JS執(zhí)行線程(其實(shí)就是主線程的意思)酪碘,實(shí)際的I/O操作都是多線程執(zhí)行的。(題外話)
那開始入正題盐茎。
簡(jiǎn)單的說 Node.js 就是運(yùn)行在服務(wù)端的 JavaScript兴垦。
Node.js 是一個(gè)基于Chrome JavaScript 運(yùn)行時(shí)建立的一個(gè)平臺(tái)。
Node.js是一個(gè)事件驅(qū)動(dòng)I/O服務(wù)端JavaScript環(huán)境字柠,基于Google的V8引擎探越,V8引擎執(zhí)行Javascript的速度非常快窑业,性能非常好钦幔。
Node.js 是運(yùn)行在服務(wù)端的 JavaScript,如果你熟悉Javascript常柄,那么你將會(huì)很容易的學(xué)會(huì)Node.js节槐。
我們假設(shè)現(xiàn)在有兩種餐廳的出餐模式:
apache模式搀庶,以下簡(jiǎn)稱A模式。一共有三個(gè)點(diǎn)餐窗口铜异,三位服務(wù)人員哥倔,三位廚師(請(qǐng)自行腦補(bǔ)畫面,但是別亂想)揍庄。顧客在任一窗口點(diǎn)餐[所謂多線程]咆蒿,點(diǎn)完后服務(wù)員傳達(dá)廚師,等待廚師出餐蚂子,服務(wù)員返給顧客[同步返回響應(yīng)結(jié)果]沃测。顧客本次購(gòu)物結(jié)束。服務(wù)員進(jìn)行下一位顧客的點(diǎn)餐[接收下一個(gè)請(qǐng)求]食茎。
nodejs模式蒂破,以下簡(jiǎn)稱N模式。一共只有一個(gè)點(diǎn)餐窗口一位服務(wù)員[單線程]别渔,一位廚師[CPU]附迷。顧客在窗口點(diǎn)餐,點(diǎn)完后服務(wù)員傳達(dá)廚師哎媚,廚師進(jìn)行出餐喇伯,而服務(wù)員不必等待[不必等待當(dāng)前請(qǐng)求返回結(jié)果],直接進(jìn)行下一位顧客的點(diǎn)餐拨与,然后繼續(xù)傳達(dá)下一個(gè)顧客的訂單給廚師稻据。廚師挨個(gè)完成后拋出給出餐窗口[異步返回響應(yīng)結(jié)果],顧客到出餐窗口取餐买喧,本次購(gòu)物結(jié)束捻悯。
那么問題來(lái)了,假設(shè)餐廳做的是鹵味(配酒的那種你懂的)淤毛,此時(shí)同時(shí)來(lái)了四個(gè)顧客秋度。A模式下有三位顧客可三個(gè)窗口同時(shí)點(diǎn)餐,另一位需等待或者說顧客覺得滿載[無(wú)法接收請(qǐng)求]也下不了單直接走人去隔壁老王家了钱床,廚師加熱2分鐘后出餐,平均每人等待2分鐘埠居。N模式下必須排隊(duì)查牌,但是可以無(wú)需等待,四位顧客都可先下單滥壕,第四位顧客的等待時(shí)間應(yīng)該是八分鐘之內(nèi)纸颜,然后到出餐窗口取。這種模式下不僅能避免A模式下因兩位顧客同時(shí)點(diǎn)了僅剩的一份雞爪而產(chǎn)生的廚師對(duì)資源處理[數(shù)據(jù)處理]的矛盾問題而且能解決同時(shí)多人來(lái)下單下不了單的問題[高并發(fā)]绎橘。
問題又來(lái)了胁孙,假設(shè)我做的是莆田鹵面生意唠倦,假設(shè)加工一份要10分鐘(豪華版),如果同時(shí)來(lái)三位顧客涮较,那A模式下每位顧客10分鐘后可用餐稠鼻,但是N模式下第三位要30分鐘后才能用餐,因?yàn)橐晃粡N師忙不過來(lái)了狂票,你下單了還是要等著候齿,表示不餓死也饞死了。這大概就是為什么需要CPU大量計(jì)算的不適合使用nodejs的一個(gè)說法吧闺属。
總結(jié):node適合運(yùn)用在高并發(fā)慌盯、io密集、少業(yè)務(wù)邏輯的場(chǎng)景掂器。
應(yīng)該說各有千秋吧亚皂,沒有最好的只有最適合的(請(qǐng)注意,話題開始跑偏)国瓮。灭必。?巍膘?~~
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 2016.9.29?
學(xué)習(xí)參考地址:
http://taobaofed.org/blog/2015/10/29/deep-into-node-1/