node.js從誕生之初就是充分考慮了在實(shí)時(shí)響應(yīng)、超大規(guī)模數(shù)據(jù)要求下的可擴(kuò)展性。這使得他擯棄了傳統(tǒng)平臺(tái)依靠多線程來實(shí)現(xiàn)高并發(fā)的設(shè)計(jì)思路,而是采用了單線程、異步式I/O,事件驅(qū)動(dòng)的程序設(shè)計(jì)模式。這些特性不僅帶來了巨大的性能提升,還減少了多線程程序設(shè)計(jì)的復(fù)雜性,進(jìn)而提高了開發(fā)效率。
Q1:單線程怎么可能榨干多核系統(tǒng)性能?
node.js最大的特點(diǎn)就是采用異步I/O與事件驅(qū)動(dòng)的架構(gòu)設(shè)計(jì)。對(duì)于高并發(fā)方案,傳統(tǒng)的架構(gòu)是多線程模型,也就是為每個(gè)業(yè)務(wù)邏輯提供一個(gè)系統(tǒng)線程,通過系統(tǒng)線程切換來彌補(bǔ)同步式I/O調(diào)度的時(shí)間開銷。node.js是單線程模型,對(duì)于所有的I/O操作都采用異步請(qǐng)求方式,避免了頻繁的上下文切換。node.js在支持的過程中會(huì)維護(hù)一個(gè)時(shí)間隊(duì)列,程序在執(zhí)行時(shí)進(jìn)入時(shí)間循環(huán)等待下一個(gè)事件到來,每個(gè)異步I/O請(qǐng)求完成之后會(huì)被推送到事件隊(duì)列,等待程序進(jìn)行處理。
C1:每業(yè)務(wù)邏輯每線程應(yīng)該是上個(gè)世紀(jì)的方案了。本世紀(jì)至少有任務(wù)池和線程池方案,牛逼的還有根據(jù)系統(tǒng)個(gè)邏輯任務(wù)的負(fù)載情況動(dòng)態(tài)調(diào)度。

想起來網(wǎng)狐的AttempterEnging已經(jīng)有這個(gè)味道了,只是沒有提升到理論高度。
node.js最大的特點(diǎn)就是異步I/O與事件緊密結(jié)合的編程模式。這種模式與傳統(tǒng)的同步模式I/O線型編程的思路有很大不同,應(yīng)為控制流很大程序上要靠事件和回調(diào)來組織,一個(gè)邏輯要拆分成若干個(gè)單元。
異步I/O擴(kuò)展一下就是把能“并發(fā)的邏輯抽取出來,讓有空余負(fù)載的‘cpu’去執(zhí)行,原負(fù)載‘cpu’可以去執(zhí)行其他需要實(shí)時(shí)響應(yīng)的邏輯”
node.js核心模塊
process: processs是一個(gè)全局變量,即global對(duì)象的屬性。他用于描述node.js進(jìn)程的狀態(tài),提供一個(gè)與操作系統(tǒng)的簡單接口。
console: console用于提供控制臺(tái)標(biāo)準(zhǔn)輸出,用于向標(biāo)準(zhǔn)輸出流或標(biāo)準(zhǔn)輸入流輸出字符
事件發(fā)射器:
events模塊只提供一個(gè)對(duì)象:events.EventEmitter,他的核心就是時(shí)間發(fā)射與事件監(jiān)聽功能的封裝。EventEmitter的每個(gè)事件由一個(gè)事件名和若干個(gè)時(shí)間參數(shù)組成,事件名是一個(gè)字符串,通常表達(dá)一定的語義。對(duì)于每個(gè)事件EventEmitter支持若干個(gè)事件監(jiān)聽器。當(dāng)時(shí)間發(fā)射時(shí),注冊到這個(gè)事件的監(jiān)聽器被依次調(diào)用,事件參數(shù)作為回調(diào)函數(shù)參數(shù)傳遞。
EventEmitter.on(event, listener) 為指定事件注冊一個(gè)監(jiān)聽器,接收一個(gè)字符串event和一個(gè)回調(diào)函數(shù)listener
EventEmitter.emic(event, args) 發(fā)射event事件,傳遞若干個(gè)可選參數(shù)到事件監(jiān)聽器參數(shù)列表
EventEmitter.once(event, listener) 為指定事件注冊一個(gè)單次監(jiān)聽器,即觸發(fā)一次后自動(dòng)解除注冊
EventEmitter.removeListener(event, listener) 解除注冊
EventEmitter.removeAllListeners(event) 移出所有時(shí)間的所有監(jiān)聽器
error事件:EventEmitter定義了一個(gè)特殊的事件Error,他包含了錯(cuò)誤的語義,在遇到異常的時(shí)候通常會(huì)發(fā)射error事件,當(dāng)error被發(fā)射時(shí),EventEmitter規(guī)定如果沒有相應(yīng)的監(jiān)聽器,node.js會(huì)把它當(dāng)作一場,退出程序并打印調(diào)用棧。
大多數(shù)時(shí)候不會(huì)直接用EventEmitter而是在對(duì)象中繼承他,只要是支持事件響應(yīng)的核心模塊都是EventEmitter的子類。