怎么理解Node.js,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。
創(chuàng)新互聯(lián)是一家專業(yè)提供永春企業(yè)網(wǎng)站建設(shè),專注與成都做網(wǎng)站、成都網(wǎng)站建設(shè)、H5開發(fā)、小程序制作等業(yè)務(wù)。10年已為永春眾多企業(yè)、政府機構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)站建設(shè)公司優(yōu)惠進行中。
一、Node簡介
二、模塊機制
A.CommonJS規(guī)范
1.模塊引用:通過require()方法來引入外部模塊
2.模塊定義:提供exports對象用于導(dǎo)出當(dāng)前模塊的方法或者變量,并且是唯一導(dǎo)出的出口
3.模塊標(biāo)識:就是傳遞給require()方法的參數(shù),必須是符合小駝峰命名的字符串,或者以.、..開頭的相對路徑
B.Node的模塊實現(xiàn)
1.不論是核心模塊還是文件模塊,require()方法對相同模塊的干凈加載都一律采用緩存優(yōu)先的方式,這是第一優(yōu)先級的
2.核心模塊》路徑形式的文件模塊》自定義模塊(自定義模塊的生成方式與JS原型鏈或作用域鏈的查找方式十分類似)
3.Node會按.js、.json、.node次序補足擴展名,在嘗試的過程中,需要調(diào)用fs模塊同步阻塞式地判斷文件是否存在,這里會是一個引起性能問題的地方,如果是.node和.json文件,在傳遞給require()時帶上擴展名
4.js模塊的編譯:包裝成(function(exports, require,module,__filename,__dirname)){….})的方式
C.核心模塊
1.JS核心模塊
Node采用了V8附帶的js2c.py工具,將所有內(nèi)置的JS代碼轉(zhuǎn)換成C++里的數(shù)組,生成node_natives.h頭文件
與文件模塊的區(qū)別在于:獲取源代碼的方式(核心模塊是從內(nèi)存中加載的)以及緩存執(zhí)行結(jié)果的位置
2.C/C++核心模塊
C++主內(nèi)完成核心,JS主外實現(xiàn)封裝的模式,Node的buffer、crypto、evals、fs、os等模塊都是部分通過C/C++編寫的
D.C/C++擴展模塊
1.JS的一個典型弱點是位運算,效率不高
E.模塊調(diào)用棧
1.C/C++內(nèi)建模塊屬于最底層模塊,如果不是非常了解要調(diào)用的C/C++內(nèi)建模塊,盡量避免使用process.binding()方法直接調(diào)用
2.JS核心模塊的職責(zé):作為C/C++內(nèi)建模塊的封裝層和橋接層;純粹的功能模塊;
3.文件模塊通常由第三方編寫,包括普通JS模塊和C/C++擴展模塊
F.包與NPM
1.包描述文件:package.json,可以幫助Node解決依賴包安裝的問題
G.前后端共用模塊
1.AMD、CMD規(guī)范
三、異步I/O
A.為什么要異步I/O
1.用戶體驗
2.資源分配
單線程同步編程模型會因阻塞I/O導(dǎo)致硬件資源得不到更優(yōu)的使用。多線程編程模型也因為編程中的死鎖、狀態(tài)同步等問題讓開發(fā)人員頭疼
Node在兩者之間給出了它的方案:利用單線程,遠離多線程死鎖、狀態(tài)同步等問題;利用異步I/O,讓單線程遠離阻塞,以更好地使用CPU
B.異步I/O實現(xiàn)現(xiàn)狀
1.阻塞/非阻塞:操作系統(tǒng)內(nèi)核對于I/O只有兩種方式,阻塞與非阻塞
在調(diào)用阻塞I/O時,應(yīng)用程序需要等待I/O完成才返回結(jié)果
阻塞I/O的一個特點是調(diào)用之后一定要等到系統(tǒng)內(nèi)核層面完成所有操作后,調(diào)用才結(jié)束
非阻塞I/O的差別是調(diào)用之后立即返回,返回的并 不是業(yè)務(wù)層期望的數(shù)據(jù),而僅僅是當(dāng)前調(diào)用的狀態(tài)。為了獲取完整的數(shù)據(jù),需要重復(fù)調(diào)用I/O操作來確認是否完成
這種重復(fù)調(diào)用判斷操作是否完成的技術(shù)叫做輪詢:read(原始、性能最低)、select(改進read,只能同時檢查1024個文件描述符)、poll(采用鏈表方式,但文件描述符多的情況下性能還是十分低下)、epoll(目前Linux下效率最高的I/O事件通知機制,真實利用了事件通知、執(zhí)行回調(diào)的方式,而不是遍歷查詢)、kqueue(僅在FreeBSD系統(tǒng)下存在)
2.理想的非阻塞異步I/O:AIO(僅支持Linux,僅支持內(nèi)核I/O中的0_DIRECT方式讀取,無法利用系統(tǒng)緩存)
3.現(xiàn)實的異步I/O:模擬線程池、glibc的AIO、libeio、windows下的IOCP
C.Node的異步I/O
1.事件循環(huán):Node自身的執(zhí)行模型,在進程啟動時,Node便會創(chuàng)建一個類似于while(true)的循環(huán),每執(zhí)行一次循環(huán)體的過程我們稱為Tick,每個Tick的過程就是查看是否有事件待處理,如果有,就取出事件及其相關(guān)的回調(diào)函數(shù)。如果存在關(guān)聯(lián)的回調(diào)函數(shù),就執(zhí)行它們
2.觀察者:每個事件循環(huán)中有一個或者多個觀察者,而判斷是否有事件要處理的過程就是向這些觀察者詢問是否有要處理的事件,瀏覽器采用了類似的機制,Node中有文件I/O觀察者、網(wǎng)絡(luò)I/O觀察者等
3.事件循環(huán)是一個典型的生產(chǎn)者/消費者模型。異步I/O、網(wǎng)絡(luò)請求等則是事件的生產(chǎn)者,事件被傳遞到觀察者那里,事件循環(huán)則從觀察都那里取出事件并處理
4.請求對象:從JS發(fā)起調(diào)用到內(nèi)核執(zhí)行完I/O操作的過渡過程中,存在一種中間產(chǎn)物,叫做請求對象
5.事件循環(huán)、觀察者、請求對象、I/O線程池這四者共同構(gòu)成了Node異步I/O模型的基本要素
D.非I/O的異步API
1.定時器
setTimeout()和setInterval()與瀏覽器中的API是一致的,他們的實現(xiàn)原理與異步I/O類似,只是不需要I/O線程池的參與
利用定時器觀察者內(nèi)部的一個紅黑樹,定時器并不精確
2.process.nextTick()
相對輕量,每次調(diào)用時,只會將回調(diào)函數(shù)放入隊列中,在下一輪Tick時取出執(zhí)行
定時器時間復(fù)雜度為O(lg(n)),nextTick()時間復(fù)雜度為O(1)
3.setImmediate()
與nextTick()類似,優(yōu)先級比nextTick()低,原因在于事件循環(huán)對觀察者的檢查是有午后順序的,nextTick()屬于idle觀察者,setImmediate()屬于check觀察者
idle觀察者->I/O觀察者->check觀察者
E.事件驅(qū)動與高性能服務(wù)器
1.Node通過事件驅(qū)動 的方式處理請求,無須為每一個請求創(chuàng)建額外的對應(yīng)線程,可以省掉創(chuàng)建線程和銷毀線程的開銷,同時操作系統(tǒng)在調(diào)度任務(wù)時因為線程少,上下文切換的代價很低
2.Nginx同樣采用事件驅(qū)動的方式
四、異步編程
A.函數(shù)式編程
1.高階函數(shù):可以將函數(shù)作為參數(shù)或是返回值,并形成了一種后續(xù)傳遞風(fēng)格,將函數(shù)的業(yè)務(wù)重點從返回值轉(zhuǎn)移到了回調(diào)函數(shù)中
2.偏函數(shù):是指創(chuàng)建一個調(diào)用另外一個部分——參數(shù)或變量已經(jīng)預(yù)置的函數(shù)——的函數(shù)用法。通過指定部分參數(shù)來產(chǎn)生一個新的定制函數(shù)的形式就是偏函數(shù)
B.異步編程的優(yōu)勢與難點
1.優(yōu)勢
Node帶來的最大特性莫過于事件驅(qū)動的非阻塞I/O模型,這是它的靈魂所在
Node是為了解決編程模型中阻塞I/O的性能問題的,采用了單線程模型,這導(dǎo)致Node更像一個處理I/O密集問題的能手
呆計算不影響異步I/O的調(diào)度,那就不構(gòu)成問題,建議對CPU的耗用不要超過10ms,或者將大量的計算分解為諸多的小量計算,通過setImmediate()進行調(diào)度
2.難點
異步處理:Node在處理異常上形成了一種約定,將異步作為回調(diào)函數(shù)的第一個參數(shù)傳回,不要對用戶傳遞的回調(diào)函數(shù)進行異常捕獲
函數(shù)嵌套過程:對于Node而言,事務(wù)中多個異步調(diào)用的場景比比皆是,這并沒有利用好異步I/O帶來的并行優(yōu)勢
阻塞代碼:沒有sleep()這樣的線程沉睡功能
多線程編程:由于前端瀏覽器存在對標(biāo)準(zhǔn)的滯后性,Web Workers沒有流行下來,Node借鑒了這個模式,child_process是其基礎(chǔ)API,cluster模塊是更深層次的應(yīng)用
異步轉(zhuǎn)同步:偶爾出現(xiàn)的同步需求將會因為沒有同步API讓開發(fā)者突然無所適從
C.異步解決方案
1.事件發(fā)布/訂閱模式
事件監(jiān)聽器模式是一種廣泛用于異步編程的模式,是回調(diào)函數(shù)的事件化,又稱發(fā)布/訂閱模式
Node自身提供的events模塊是發(fā)布/訂閱模式的一個簡單實現(xiàn),Node中部分模塊都繼承自它
事件發(fā)布/訂閱模式自身并無同步和異步調(diào)用的問題,但在Node中,emit()調(diào)用多半是伴隨事件循環(huán)而異步觸發(fā)的,所以廣泛應(yīng)用于異步編程
常常用來解耦業(yè)務(wù)邏輯,也是一種鉤子機制,利用鉤子導(dǎo)出內(nèi)部數(shù)據(jù)或狀態(tài)給外部的調(diào)用者
如果對一個事件添加了超過10個偵聽器,會得到警告;為了處理異常,EventEmitter對象對error事件進行了特殊對待
利用once解決緩存雪崩問題
2.Promise/Deferred模式
Promises/A:只要具備then()有一份發(fā)即可
Promise通過封裝異步調(diào)用,實現(xiàn)了正向用例和反向用例的分享以及邏輯處理延遲
Promise模式比原始的事件偵聽和觸發(fā)略為優(yōu)美,它的缺陷則是需要為不同的場景封裝不同的API,沒有直接的原生事件那么靈活
Promise和秘決其實在于對隊列的操作
3.流程控制庫
尾觸發(fā)與Next:除了事件和Promise外,還有一類方法是需要手工調(diào)用才能持續(xù)執(zhí)行后續(xù)調(diào)用的,我就將此類方法叫做尾觸發(fā),常見的關(guān)鍵詞是next,應(yīng)用最多的是Connect的中間件
中間件機制使得在處理網(wǎng)絡(luò)請求時,可以像面向切面 編程一樣進行過濾、驗證、日志等功能,而不與具體業(yè)務(wù)邏輯產(chǎn)生關(guān)聯(lián),以致產(chǎn)生耦合
中間件并不要求每個中間方法都是異步的,但是如果每個步驟都采用異步來完成,實際上只是串行化的處理,沒辦法通過并行的異步調(diào)用來提升業(yè)務(wù)的處理效率
async方法:series()實現(xiàn)一組任務(wù)的串行執(zhí)行;parallel()實現(xiàn)并行異步操作;waterfall()實現(xiàn)前一個結(jié)果是后一個的輸入;auto實現(xiàn)自動依賴處理
Step庫:默認實現(xiàn)串行方式,this中包含parallel()方法實現(xiàn)并行,group()實現(xiàn)分組
Wind庫
D.異步并發(fā)控制
1.異步I/O與同步I/O的顯著差距:同步I/O因為每個I/O都是彼此阻塞的,在循環(huán)體中,總是一個接一個調(diào)用,不會出現(xiàn)耗用文件描述符太多的情況,同時性能也是低下的;對于異步I/O,雖然并發(fā)容易實現(xiàn),但是由于太容易實現(xiàn),依然需要控制。盡管是要壓榨底層系統(tǒng)的恒通,但還是需要給予一定的過載保護,以防止過猶不及
2.bagpipe的解決方案
通過一個隊列來控制并發(fā)量
如果當(dāng)前活躍(指調(diào)用發(fā)起但未執(zhí)行回調(diào))的異步調(diào)用量小于限定值,從隊列中取出執(zhí)行
如果活躍調(diào)用達到限定值,調(diào)用暫存放在隊列中
每個異步調(diào)用結(jié)束時,從隊列中取出新的異步調(diào)用執(zhí)行
3.async的解決方案:parallelLimit()方法
五、內(nèi)存控制
A.V8的垃圾回收機制與內(nèi)存限制
1.V8的內(nèi)存限制:64位系統(tǒng)下約為1.4GB,32位系統(tǒng)下約為0.7GB
2.V8中,所有的JS對象都是通過堆來進行分配的,使用process.memoryUsage()來查看,heapTotal和heapUsed表示已申請到的內(nèi)存和當(dāng)前使用的量,rss是resident set size的縮寫,即進程的常駐內(nèi)存部分
3.在V8中,主要將內(nèi)存分為新生代和老生代,新生代中的對象為存活時間較短的對象,老生代中的對象為存活時間較長或常駐內(nèi)存的對象
4.在分代的基礎(chǔ)上,新生代中的對象主要通過Scavenge算法進行垃圾回收。在Scavenge的具體實現(xiàn)中,主要采用了Cheney算法;在老生代中主要采用了Mark-Sweep和Mark-Compact相結(jié)合的方式進行垃圾回收
5.為了降低全堆垃圾回收帶來的停頓時間,V8先從標(biāo)記階段入手,將原本要一口氣停頓完成的動作改為增量標(biāo)記(incremental marking),也就是拆分為這么多小“步進”,每做完一“步進”就讓JS應(yīng)用邏輯執(zhí)行一小會兒,垃圾回收與應(yīng)用邏輯交替執(zhí)行直到標(biāo)記階段完成
B.高效使用內(nèi)存
1.作用域:如果變量是全局變量(不通過var或定義在global變量上),由于全局作用域需要直到進程退出才能釋放,此時將導(dǎo)致引用 的對象常駐內(nèi)存(常駐在老生代中),如果需要釋放常駐內(nèi)存的對象,可以通過delete操作來刪除引用關(guān)系,在V8中通過delete刪除對象的屬性有可能干擾V8的優(yōu)化,所以通過賦值方式解除引用更好
2.閉包:一旦有變量引用中間函數(shù),這個中間函數(shù)將不會釋放,同時也支使原始的作用域不會得到釋放,作用域中產(chǎn)生的內(nèi)存占用也不會得到釋放。除非不同有引用,都會逐步釋放
C.內(nèi)存指標(biāo)
1.查看內(nèi)存使用情況
2.os模塊中的totalmem()和freemen()這兩個方法用于查看操作系統(tǒng)的內(nèi)存使用情況,分別返回系統(tǒng)的總內(nèi)存和閑置內(nèi)存
不是通過V8分配的內(nèi)存稱為堆外內(nèi)存,利用堆外內(nèi)存可以突破內(nèi)存限制 的問題
3.Node的內(nèi)存構(gòu)成主要由通過V8進行分配的部分和Node自行分配的部分。受V8的垃圾回收限制的主要是V8的堆內(nèi)存
D.內(nèi)存泄漏
1.在Node中,緩存并非物美價廉,一旦一個對象被當(dāng)做緩存來使用,那就意味著它將會常駐在老生代中。緩存中的鍵越多,長期存活的對象也就越多,這將導(dǎo)致垃圾回收在進行掃描和整理時,對這些對象做無用功
2.盡量使用外部緩存,如redis和Memcached
3.隊列問題,如數(shù)據(jù)庫寫入操作的堆積:
表層解決方案是換用消費速度更高的技術(shù)
深層的解決方案應(yīng)該是監(jiān)控隊列的長度,一旦堆積,應(yīng)當(dāng)通過監(jiān)控系統(tǒng)產(chǎn)生報警并通知相關(guān)人員
E.內(nèi)存泄漏排查
1.node-heapdump、node-memwatch等工具
F.大內(nèi)存應(yīng)用
1.Node提供了stream處理大文件,如果不需要進行字符串層面的操作,則不需要V8來處理,可以嘗試進行純粹的Buffer操作,這不會受到V8內(nèi)存堆的限制
六、理解Buffer
A.Buffer結(jié)構(gòu)
1.Buffer是一個典型的JS與C++結(jié)合的模塊,它將性能相關(guān)部分用C++實現(xiàn),將非性能相關(guān)的部分用JS實現(xiàn)
2.Buffer受Array類型的影響很大,可以訪問length屬性得到長度,也可以通過下標(biāo)訪問元素;給元素的賦值如果小于0,就將該值逐次加到256,直到得到一個0到255之間的整數(shù)。如果得到的數(shù)值大于255,就逐次減256,如果是小數(shù),舍棄小數(shù)部分
3.Node在內(nèi)存的使用上應(yīng)用的是在C++層面申請內(nèi)存、在JS中分配內(nèi)存的策略。Node采用了slab分配機制
B.Buffer的轉(zhuǎn)換
1.字符串:
new Buffer(str,[encoding]);
buf.toString([encoding],[start],[end]);
Buffer.isEncoding(encoding),判斷編碼是否支持轉(zhuǎn)換,可以使用iconv和iconv-lite庫
C.Buffer的拼接
1.Buffer不等于字符串,只是會隱式轉(zhuǎn)換!!需要注意編碼問題
2.setEncoding()只能處理utf8、Base64和UCS-2/UTF-16LE這3種編碼
3.用一個數(shù)組來存儲接收到的所有Buffer片段并記錄下所有片段的總長度,然后調(diào)用Buffer.concat()方法生成一個合并的Buffer對象。Buffer.concat()方法封裝了從小Buffer對象向大Buffer對象的復(fù)制過程。
D.Buffer與性能
1.通過預(yù)告轉(zhuǎn)換靜態(tài)內(nèi)容為Buffer對象,可以有效地減少CPU的重復(fù)使用,節(jié)省服務(wù)器資源。在Node構(gòu)建的Web應(yīng)用中,可以選擇將頁面中的動態(tài)內(nèi)容和靜態(tài)內(nèi)容分離,靜態(tài)內(nèi)容部分可以通過預(yù)先轉(zhuǎn)換為Buffer的方式,使性能得到提升。由于文件自身是二進制數(shù)據(jù),所以在不需要改變內(nèi)容的場景下,盡量只讀取Buffer,然后直接輸出,不做額外的轉(zhuǎn)換,避免損耗
2.highWaterMark的大小對性能的影響
highWaterMark設(shè)置對Buffer內(nèi)存的分配和使用有一定影響
highWaterMark設(shè)置過濾,可能導(dǎo)致系統(tǒng)調(diào)用次數(shù)過多
3.如果文件較?。ㄐ∮?kb),有可能造成slab未能完全使用;對于大文件而言,highWaterMark的大小決定會觸發(fā)系統(tǒng)調(diào)用和data事件的次數(shù);讀取一個相同的大文件時,highWaterMark值的大小與速度的關(guān)系:該值越大,讀取速度越快
七、網(wǎng)絡(luò)編程
A.構(gòu)建TCP服務(wù)
1.服務(wù)器事件(net.createServer()):listening、connection、close、error
2.連接事件(net.connecct()):data、end、connect、drain、error、close、timeout
3.在Node中,由于TCP默認啟用了Nagle算法
B.構(gòu)建UDP服務(wù)
1.UDP事件:message、listening、close、error
C.構(gòu)建HTTP服務(wù)
1.http服務(wù)端事件:connection、request、close、checkContinue、connect、upgrade、clientError
2.http客戶端事件:response、socket、connect、upgrade、continue
D.構(gòu)建WebSocket服務(wù)
E.網(wǎng)絡(luò)服務(wù)與安全
1.Node在網(wǎng)絡(luò)安全上提供了3個模塊,分別為crypto、tls和https
八、構(gòu)建Web應(yīng)用
1.Cookie優(yōu)化:減小Cookie的大?。粸殪o態(tài)組件使用不同的域名;減少DNS的查詢;
2.緩存規(guī)則:添加Expires或Cache-Control到報文頭中;配置ETags;讓Ajax可緩存;
3.清除緩存:url請求后帶版本號,如http://xxx.com/?v=1.0.0
4.Content-Disposition,inline表示內(nèi)容只需即時查看,attachment表示數(shù)據(jù)可以存為附件
九、玩轉(zhuǎn)進程
1.PHP的健壯性是由它給每個請求都建立獨立的上下文來實現(xiàn)的
2.Master-Worker模式,又稱主從模式。主進程不負責(zé)具體的業(yè)務(wù)處理,而是負責(zé)調(diào)度或管理工作進程,它是趨向于穩(wěn)定的。工作進程負責(zé)具體的業(yè)務(wù)處理。
3.child_process模塊:
spawn():啟動一個子進程來執(zhí)行命令
exec():與spawn()不同的是有一個回調(diào)函數(shù)獲子進程的狀況,可以指定timeout屬性設(shè)置超時時間,適合執(zhí)行現(xiàn)有命令
execFile():啟動一個子進程來執(zhí)行可執(zhí)行文件,適合執(zhí)行文件
Fork():創(chuàng)建Node的子進程只需要指定要執(zhí)行的JS文件模塊即可
4.WebWorker允許創(chuàng)建工作線程并在后臺運行,使得一些阻塞較為嚴重的計算不影響主線程上的UI渲染
5.IPC(Inter-Process Communication,進程間通信),是為了讓不同的進程能夠互相訪問資源并進行協(xié)調(diào)工作,Node中使用的是管道(pipe)技術(shù)
6.句柄是一種可以用來標(biāo)識資源的引用,它的內(nèi)部包含了指向?qū)ο蟮奈募枋龇?/p>
7.Cluster事件:fork、online、listening、disconnect、exit、setup
十、測試
A.單元測試
1.編寫可測試代碼的原則:單一職責(zé)、接口抽象、層次分離
2.單元測試主要包含斷言、測試框架、測試用例、測試覆蓋率、mock、持續(xù)集成等,Node還會加入異步代碼測試和私有方法測試
3.斷言:是一種放在程序中的一階邏輯(如一個結(jié)果為真或是假的邏輯判斷式),目的是為了標(biāo)示程序開發(fā)者預(yù)期的結(jié)果——當(dāng)程序運行到斷言的位置時,對應(yīng)的斷言應(yīng)該為真。若斷言不為真,程序會中止運行,并出現(xiàn)錯誤信息
4.Node中的assert模塊包含:ok()、equal()、notEqual()、deepEqual()、notDeepEqual()、strictEqual()、notStrictEqual()、throws()、doesNotThrow()、ifError()
5.單元測試測試風(fēng)格:
TDD(測試驅(qū)動開發(fā)):關(guān)注所有功能是否被正確實現(xiàn),表述方式偏向于功能說明書的風(fēng)格
BDD(行為驅(qū)動開發(fā)):關(guān)注整體行為是否符合預(yù)期,表述方式更接近于自然語言的習(xí)慣
6.相關(guān)工具:mocha、blanket、jscover、muk、Makefile、travis-ci
B.性能測試
1.基準(zhǔn)測試:benchmark
2.壓力測試:ab、siege、http_load
十一、產(chǎn)品化
A.項目工程化
1.目錄結(jié)構(gòu) :只要遵循單一原則即可
2.構(gòu)建工具:Makefile、Grunt
3.編碼規(guī)范:JSLint、JSHint
4.代碼審查
B.部署流程
1.在實際的項目需求中,有兩點需要驗證:一是功能的正確性,一是與數(shù)據(jù)相關(guān)的檢查
C.性能
1.拆分原則:做專一的事、讓擅長的工具做擅長的事情、將模型簡化、將風(fēng)險分離
2.動靜分離、啟用緩存、多進程架構(gòu)、讀寫分離
D.日志
1.訪問日志、異常日志、數(shù)據(jù)庫記錄、分割日志
E.監(jiān)控報警
1.監(jiān)控:日志監(jiān)控、響應(yīng)時間、進程監(jiān)控、磁盤監(jiān)控、內(nèi)存監(jiān)控、CPU占用監(jiān)控、CPU load監(jiān)控、I/O負載、網(wǎng)絡(luò)監(jiān)控、應(yīng)用狀態(tài)監(jiān)控、DNS監(jiān)控
2.報警的實現(xiàn):郵件報警、短信或電話報警
F.穩(wěn)定性
1.多機器:需要考慮負載均衡、狀態(tài)共享、數(shù)據(jù)一致性、反向代理
2.多機房
3.容災(zāi)備份
G.異構(gòu)共存
1.通過協(xié)議與已有的系統(tǒng)進行異構(gòu)共存
附錄B.調(diào)試Node
1.Debugger
通過debugger;設(shè)置斷點
使用node debug xxxx.js
步進指令:cont或c、next或n、step或s、out或o、pause
2.Node Inspector
看完上述內(nèi)容是否對您有幫助呢?如果還想對相關(guān)知識有進一步的了解或閱讀更多相關(guān)文章,請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝您對創(chuàng)新互聯(lián)的支持。