翻譯--Blazing fast node.js: 10 performance tips from LinkedIn Mobile

yupeng發表於2013-12-05

1.避免使用同步程式碼:

// Good: write files asynchronously
fs.writeFile('message.txt', 'Hello Node', function (err) {
  console.log("It's saved and the server remains responsive!");
});
 
// BAD: write files synchronously
fs.writeFileSync('message.txt', 'Hello Node');
console.log("It's saved, but you just blocked ALL requests!");

code 的github地址

2.關閉sockect池:

  nodejs的http客戶端會自動的使用sockect池,預設情況下,每一臺主機限制你最多使用5個sockect連線,sockect重用能保持很多的資源能夠在一定範圍內重用,如果你想控制從相同主機取資料的大量請求,這會有很多的瓶頸。在這種情況下,一個很好的辦法是提高maxSockets 的值或者是徹底的關閉sockect池

var http = require('http');
var options = {.....};
options.agent = false;
var req = http.request(options)

code的github 地址

3.不要使用nodejs 做靜態資源儲存

4.在客戶端渲染頁面

5.使用gzip壓縮

6.並行

  試著去處理你的所有阻礙操作,也就是說,並行請求你的遠端服務,資料庫呼叫,檔案訪問,這個將會減少潛在的最慢的請求,而不是所有的在一個佇列中的總和時間,為了保持比較好的控制回撥和錯誤資訊,我建議step 框架去做工作流控制

7.session 空閒

  LinkedIn mobile 使用express 框架控制請求和響應,很多的express 例子中都包含了如下的配置

app.use(express.session({ secret: "keyboard cat" }));

一般地,session 資料是儲存在記憶體中,這個將會導致系統開銷,特別是有很多的使用者組,當然你也可以使用外部的session 儲存,比如說MongoDB or Redis,但是這樣做的話,就會導致遠端請求session 資料的系統開銷。當然,如果可能,最好的選項是不在服務端儲存session資料。在express 框架中不要包含上述配置你將得到更好的效能。

8.使用二進位制模組

  如果可能的話,儘量使用二進位制模組,而不使用javascript 庫,例如:當我們使用SHA模組轉換的話,我們將看到有更好的效能。

// Use built in or binary modules
var crypto = require('crypto');
var hash = crypto.createHmac("sha1",key).update(signatureBase).digest("base64");

9.使用標準的V8而不是使用客戶端的庫

10.保持你的程式碼小而簡潔

  時不時的問問自己這幾個問題:

  1.我真的需要這個模組嗎?

  2.我為什麼要使用這個框架?

  3.這個系統開銷值得嗎?

  4.我是否可以用一個更簡單的方式去實現這個?

 

翻譯文章地址:http://engineering.linkedin.com/nodejs/blazing-fast-nodejs-10-performance-tips-linkedin-mobile

相關文章