nodejs怎麼部署能hold住訪問量較大的項目?
如題,除了部署,還有哪些開發上需要注意的東西?
夜深了,簡單說說。
最重要的,從代碼層面保證你的應用不會崩潰或者溢出,遵守社區約定,每次callback的時候都把錯誤暴露出來,然後在適當的時機處理掉錯誤,而不是直接throw出來讓進程掛掉。像我們公司的業務代碼,幾十萬行,不會出現一行代碼會讓整個app崩潰,這個其實是很正常的,只要處理好,是不會閑著沒事crash的。
另外,部署的時候,多機部署,防止單機崩潰服務中斷。
用pm2部署線上應用,pm2可以做到crash自啟,還有很多其他的功能。另外,如果你的代碼不夠健壯,一定要注意收集錯誤信息,不管是簡訊報警,還是使用第三方服務,都非常有必要。
一個穩定的線上服務,還是有很多點的,一時也講不完。
其他的關鍵字,例如 服務自檢,伺服器性能監控,代碼性能分析,單元測試,不展開了。
單伺服器多核擴展:Cluster Node.js v5.0.0 Manual Documentation,基本原理:
var cluster = require("cluster");
if (cluster.isMaster) {
// 控制進程,管理worker進程
// 管理整個cluster進程間通信
// 平衡任務分發到worker進程
for (var i = 0; i &< 10; i++) {
// 產生新worker進程
cluster.fork();
}
} else {
// UDP埠上的worker
// 處理具體業務
// 各自獨立
require("./app.js").listen(PORT);
}
網上例子很多:How to Create a Node.js Cluster for Speeding Up Your Apps請自己研究吧。
多伺服器擴展:相同的單台擴展原理 + nginx這樣的load balancer# nginx
upstream appfarm {
listen ...
server x.x.x.1
server x.x.x.2
server x.x.x.3
}
網上的一個例子:http://subprint.com/blog/nginx-load-balancer-and-reverse-proxy-for-node.js-applications-on-digital-ocean,請自行研究。
Session數據存儲會用Redis這樣兼具效率和持久化的方案。資料庫的伸縮本身是一個問題,但大流量訪問部署的時候要管理好連接數,會特別注意connection pooling:如felixge/node-mysql · GitHub書上都有:
Deploying Node.jsNode.js the Right Way: Practical, Server-Side JavaScript That Scales
嘿嘿。。。 是系統工程,和具體編程模型關係不大。
除了標準的Cluster之外,如果想利用幾十上百的內核,數以百G的內存,Transactional Memory 可以看看SyntheticSemantics/ems · GitHub。
到了一定量級,已經和語言無關了,是系統架構的問題了。
比如動靜資源分離,靜態資源上cdn;多級緩存:從頁面緩存到數據緩存;非同步IO;分散式集群;動態負載均衡;服務質量監控等。到這一層面已經和nodejs無關了,不管php,jsp,asp還是其他什麼p,都需要在系統架構上去優化了。推薦閱讀: