深入淺出Node.js學(xué)習(xí)筆記(十一)

產(chǎn)品化

1. 項目工程化

所謂的工程化抄囚,可以理解為項目的組織能力泊藕。所謂的工程化载佳,可以理解為項目的組織能力炒事。體現(xiàn)在文件上,就是文件的組織能力蔫慧。

1.1 目錄結(jié)構(gòu)

主要的兩類項目為Web應(yīng)用和模塊應(yīng)用挠乳。普通的模塊應(yīng)用遵循CommonJS的模塊和包規(guī)范。對于Web應(yīng)用姑躲,組織方式各種各樣睡扬,但是只要遵循單一原則即可。

1.2 構(gòu)建工具

要想真正能用上源代碼黍析,還需要一定的操作卖怜,操作包括合并靜態(tài)文件、壓縮文件大小阐枣、打包應(yīng)用马靠、編譯模塊。每次都手動完成這些操作蔼两,效率會比較低下甩鳄。為了節(jié)省資源,使用構(gòu)建工具完成這些工作额划。

Node上的構(gòu)建工具:

  1. Makefile

    只能在*nix操作系統(tǒng)上有效娩贷;

  2. Grunt

    可以跨平臺;

1.3 編碼規(guī)范

編碼規(guī)范的實現(xiàn)方式:

  1. 文檔式的約定锁孟;(依靠自覺)
  2. 代碼提交時的強(qiáng)制檢查彬祖;(依靠工具)

1.4 代碼審查

代碼審查建立在具體的代碼提交過程中茁瘦。

對于使用GitHub或Gitlab開源工具搭建的代碼托管平臺,可以利用git的分支特點储笑,很好地實現(xiàn)代碼審查甜熔。

2. 部署流程

代碼在完成開發(fā)、審查突倍、合并之后進(jìn)入部署流程腔稀。

2.1 部署環(huán)境

在實際項目需求中,有兩點需要驗證羽历,一是功能的正確性焊虏,二是與數(shù)據(jù)相關(guān)的檢查。

普通測試環(huán)境稱為stage環(huán)境秕磷;

預(yù)發(fā)布環(huán)境稱為pre-release環(huán)境诵闭;

實際的生產(chǎn)環(huán)境稱為product環(huán)境;

2.2 部署操作

就普通的實例代碼而言澎嚣,通常直接在命令行執(zhí)行node file.js以啟動應(yīng)用疏尿。

對于長時間執(zhí)行的服務(wù)進(jìn)程而言,存在兩個問題:

  1. 占住一個命令行窗口易桃;
  2. 隨著窗口的退出會導(dǎo)致打開的進(jìn)程一并退出褥琐;

為了能讓進(jìn)程持續(xù)執(zhí)行,用nohup和&以不掛斷進(jìn)程的方式執(zhí)行:

$ nohup node app.js &

3. 性能

Node產(chǎn)品的性能與許多因素相關(guān)晤郑,對于Web應(yīng)用而言敌呈,最直接有效的莫過于動靜分離、多進(jìn)程架構(gòu)造寝、分布式驱富。

拆分原則:

  • 做專一的事
  • 讓擅長的工具做擅長的事情
  • 讓模型簡化
  • 將風(fēng)險分離
  • 緩存

3.1 動靜分離

在普通的Web應(yīng)用中,Node盡管可以通過中間件實現(xiàn)靜態(tài)文件服務(wù)匹舞,但是Node處理靜態(tài)文件的能力不夠退出褐鸥。將圖片、腳本赐稽、樣式表和多媒體等靜態(tài)文件都引導(dǎo)到專業(yè)的靜態(tài)文件服務(wù)器上叫榕,讓Node只處理動態(tài)請求即可。這個過程可以用Nginx或者專業(yè)的CDN來處理姊舵。

將動態(tài)請求和靜態(tài)請求分離后晰绎,服務(wù)器可以專注于動態(tài)服務(wù)方面,專業(yè)的CDN會將靜態(tài)文件與用戶盡可能靠近括丁,同時能夠有更精確和高效的緩存機(jī)制荞下。靜態(tài)文件請求分離后,對靜態(tài)請求使用不同的域名或多個域名還能消除掉不必要的Cookie傳輸和瀏覽器對下載線程數(shù)的限制。

3.2 啟用緩存

提升性能的兩個途徑:

  1. 提升服務(wù)的速度尖昏;
  2. 避免不必要的計算仰税;

前者提升的性能在海量流量面前終有瓶頸,但后者卻能夠在訪問量越大時收益越多抽诉。避免不必要的計算陨簇,應(yīng)用場景最多的就是緩存。

Redis和Memcached幾乎是Web應(yīng)用的標(biāo)準(zhǔn)配置迹淌。

如果你的產(chǎn)品需要應(yīng)對巨大的流量河绽,啟動緩存并應(yīng)用好它,是系統(tǒng)性能瓶頸的關(guān)鍵唉窃。

3.3 多進(jìn)程架構(gòu)

通過多進(jìn)程架構(gòu)耙饰,不僅可以充分利用多核CPU,更是可以建立機(jī)制讓Node進(jìn)程更加健壯纹份,以保障Web應(yīng)用持續(xù)服務(wù)苟跪。

3.4 讀寫分離

針對數(shù)據(jù)庫而言,讀取的速度遠(yuǎn)遠(yuǎn)高于寫入的速度矮嫉。兒某些數(shù)據(jù)庫在寫入時為了保證數(shù)據(jù)一致性,會進(jìn)行鎖表的操作牍疏,這同時會影響到讀取的速度蠢笋。某些系統(tǒng)為了提升性能,通常會進(jìn)行數(shù)據(jù)庫的讀寫分離鳞陨,將數(shù)據(jù)進(jìn)行主從設(shè)計昨寞,這樣讀數(shù)據(jù)不再受到寫入的影響,降低了性能的影響厦滤。

4. 日志

在健全的系統(tǒng)中援岩,完善的日志最能夠還原問題現(xiàn)場。通過記錄日志來定位問題是一種成本較小的方式掏导。

4.1 訪問日志

訪問日志一般用來記錄每個客戶端應(yīng)用的訪問享怀。在Web應(yīng)用中,主要記錄HTTP請求中的關(guān)鍵數(shù)據(jù)趟咆。一般的Web服務(wù)器都實現(xiàn)了記錄訪問日志的功能添瓷。只要簡單的配置即可啟用。在用Nginx或Apache進(jìn)行反向代理時值纱,可以利用這些已有的設(shè)施完成訪問日志的記錄鳞贷。

4.2 異常日志

異常日志通常用來記錄那些意外產(chǎn)生的異常錯誤。通過日志的記錄虐唠,開發(fā)者可以根據(jù)異常信息定位Bug出現(xiàn)的具體位置搀愧,以快速修復(fù)問題。

異常日志的分級:

  • console.log:普通日志
  • console.info:普通信息
  • console.warn:警告信息
  • console.error:錯誤信息

4.3 日志與數(shù)據(jù)庫

對日志不了解的開發(fā)者會選擇將日志寫入數(shù)據(jù)庫中。數(shù)據(jù)庫比日志文件好的地方在于它是結(jié)構(gòu)化數(shù)據(jù)咱筛,可以直接編寫SQL語句進(jìn)行分析搓幌,日志文件則需要再加工之后才能分析。

4.4 分割日志

線上業(yè)務(wù)可能訪問量巨大眷蚓,產(chǎn)生的日志也可能是大量的鼻种,將產(chǎn)生的日志按日期分割是個不錯的主意。

5. 監(jiān)控報警

應(yīng)用的監(jiān)控主要分兩類:

  1. 業(yè)務(wù)邏輯型的監(jiān)控沙热;
  2. 硬件型的監(jiān)控叉钥;

監(jiān)控主要通過定時采樣來進(jìn)行記錄。

5.1 監(jiān)控

監(jiān)控的主要目的是為了將一些重要指標(biāo)采樣記錄下來篙贸,一旦這些指標(biāo)發(fā)生較大變化投队,可以配合報警系統(tǒng)將問題反饋到負(fù)責(zé)人那。

  1. 日志監(jiān)控
  2. 響應(yīng)時間
  3. 進(jìn)程監(jiān)控
  4. 磁盤監(jiān)控
  5. 內(nèi)存監(jiān)控
  6. CPU占用監(jiān)控
  7. CPU load監(jiān)控
  8. I/O負(fù)載
  9. 網(wǎng)絡(luò)監(jiān)控
  10. 應(yīng)用狀態(tài)監(jiān)控
  11. DNS監(jiān)控

5.2 報警的實現(xiàn)

  • 郵件報警
  • 短信或電話報警

5.3 監(jiān)控系統(tǒng)的穩(wěn)定性

為了保證應(yīng)用的穩(wěn)定性爵川,引入了一個龐大的監(jiān)控系統(tǒng)敷鸦,監(jiān)控系統(tǒng)自身的穩(wěn)定性對應(yīng)用也非常重要。

6. 穩(wěn)定性

為了更好的穩(wěn)定性寝贡,典型的水平擴(kuò)展方式就是多進(jìn)程扒披、多機(jī)器、對機(jī)房圃泡。

7.異構(gòu)共存

站在技術(shù)的產(chǎn)品化的角度來看碟案,選擇一門新技術(shù)應(yīng)用在生產(chǎn)環(huán)境就得考慮與已有的系統(tǒng)或者服務(wù)能否異構(gòu)共存。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末颇蜡,一起剝皮案震驚了整個濱河市价说,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌风秤,老刑警劉巖鳖目,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異缤弦,居然都是意外死亡领迈,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進(jìn)店門碍沐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來惦费,“玉大人,你說我怎么就攤上這事抢韭⌒狡叮” “怎么了?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵刻恭,是天一觀的道長瞧省。 經(jīng)常有香客問我扯夭,道長,這世上最難降的妖魔是什么鞍匾? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任交洗,我火速辦了婚禮,結(jié)果婚禮上橡淑,老公的妹妹穿的比我還像新娘构拳。我一直安慰自己,他們只是感情好梁棠,可當(dāng)我...
    茶點故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布置森。 她就那樣靜靜地躺著,像睡著了一般符糊。 火紅的嫁衣襯著肌膚如雪凫海。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天男娄,我揣著相機(jī)與錄音行贪,去河邊找鬼。 笑死模闲,一個胖子當(dāng)著我的面吹牛建瘫,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播尸折,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼啰脚,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了翁授?” 一聲冷哼從身側(cè)響起拣播,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤晾咪,失蹤者是張志新(化名)和其女友劉穎收擦,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體谍倦,經(jīng)...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡塞赂,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了昼蛀。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片宴猾。...
    茶點故事閱讀 40,013評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖叼旋,靈堂內(nèi)的尸體忽然破棺而出仇哆,到底是詐尸還是另有隱情,我是刑警寧澤夫植,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布讹剔,位于F島的核電站油讯,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏延欠。R本人自食惡果不足惜陌兑,卻給世界環(huán)境...
    茶點故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望由捎。 院中可真熱鬧兔综,春花似錦、人聲如沸狞玛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽为居。三九已至碌宴,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蒙畴,已是汗流浹背贰镣。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留膳凝,地道東北人碑隆。 一個月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像蹬音,于是被迫代替她去往敵國和親上煤。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,960評論 2 355

推薦閱讀更多精彩內(nèi)容