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

如果是大量繁重的後台任務,比如後台發送郵件或者日誌處理等,前端實時性要求較低,通常引入隊列,用類似https://www.npmjs.com/package/zmq。原理是前端進程不立即處理這些任務,而是發一個消息到一個隊列,讓隊列去分發管理這些任務的執行,模式可以很靈活,請看http://www.slideshare.net/fedario/zero-mq-with-nodejs。

書上都有:

Deploying Node.js

Node.js the Right Way: Practical, Server-Side JavaScript That Scales


嘿嘿。。。 是系統工程,和具體編程模型關係不大。


除了標準的Cluster之外,如果想利用幾十上百的內核,數以百G的內存,Transactional Memory 可以看看SyntheticSemantics/ems · GitHub。


到了一定量級,已經和語言無關了,是系統架構的問題了。

比如動靜資源分離,靜態資源上cdn;

多級緩存:從頁面緩存到數據緩存;

非同步IO;

分散式集群;

動態負載均衡;

服務質量監控等。

到這一層面已經和nodejs無關了,不管php,jsp,asp還是其他什麼p,都需要在系統架構上去優化了。


推薦閱讀:

TAG:伺服器 | Nodejs | Nginx | Express框架 |