產(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)建工具:
-
Makefile
只能在*nix操作系統(tǒng)上有效娩贷;
-
Grunt
可以跨平臺;
1.3 編碼規(guī)范
編碼規(guī)范的實現(xiàn)方式:
- 文檔式的約定锁孟;(依靠自覺)
- 代碼提交時的強(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)程而言,存在兩個問題:
- 占住一個命令行窗口易桃;
- 隨著窗口的退出會導(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 啟用緩存
提升性能的兩個途徑:
- 提升服務(wù)的速度尖昏;
- 避免不必要的計算仰税;
前者提升的性能在海量流量面前終有瓶頸,但后者卻能夠在訪問量越大時收益越多抽诉。避免不必要的計算陨簇,應(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)控主要分兩類:
- 業(yè)務(wù)邏輯型的監(jiān)控沙热;
- 硬件型的監(jiān)控叉钥;
監(jiān)控主要通過定時采樣來進(jìn)行記錄。
5.1 監(jiān)控
監(jiān)控的主要目的是為了將一些重要指標(biāo)采樣記錄下來篙贸,一旦這些指標(biāo)發(fā)生較大變化投队,可以配合報警系統(tǒng)將問題反饋到負(fù)責(zé)人那。
- 日志監(jiān)控
- 響應(yīng)時間
- 進(jìn)程監(jiān)控
- 磁盤監(jiān)控
- 內(nèi)存監(jiān)控
- CPU占用監(jiān)控
- CPU load監(jiān)控
- I/O負(fù)載
- 網(wǎng)絡(luò)監(jiān)控
- 應(yīng)用狀態(tài)監(jiān)控
- 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)共存。