這篇文章主要介紹了充分發揮Node.js程序性能的一些方法介紹,Node.js是把JavaScript用于服務器端的框架,需要的朋友可以參考下
一個Node.JS 的進程只會運行在單個的物理核心上,就是因為這一點,在開發可擴展的服務器的時候就需要格外的注意。
因為有一系列穩定的API,加上原生擴展的開發來管理進程,所以有很多不同的方法來設計一個可以并行的Node.JS運用。在這篇博文里,我們就來比較下這些可能的架構。
這篇文章同時也介紹compute-cluster 模塊:一個小型的Node.JS庫,可以用來很方便的管理進程,從來二線分布式計算。
遇到的問題
我們在Mozilla Persona的項目中需要可以處理大量不同特征的請求,所以我們嘗試用使用Node.JS。
為了不影響用戶體驗,我們設計的‘Interactive' 請求只需要輕量級的計算消耗,但是提供更快地反映時間使得UI沒有卡殼的感覺。相比之下,‘Batch'操作大概需要半秒的處理時間,而且有可能由于其他的原因,會有更長的延遲。
為了更好的設計,我們找了很多符合我們當前需求的方法去解決。
考慮到擴展性和成本,我們列出以下關鍵需求:
效率:能有效的使用所有空閑的處理器
響應:我們的“應用”能實時快速的響應
優雅:當請求量過多到不能處理的時候,我們處理我們能處理的。不能處理的要清晰的把錯誤反饋
簡單:我們的解決方案使用起來必須簡單方便
通過以上幾點我們可以清楚、有目標的去篩選
方案一:直接在主線程中處理.
當主線程直接處理數據的時候,結果很不好:
你不能充分利用多核CPU的優勢,在交互式的請求/響應中,必須等待當前請求(或響應)處理完畢,毫無優雅可言。
這個方案唯一的優點是:夠簡單
?
1
2
3
4function myRequestHandler(request, response) [
// Let's bring everything to a grinding halt for half a second.
var results = doComputationWorkSync(request.somesuch);
}
在 Node.JS 程序中,希望同時處理多個請求,又想同步進行處理,那你準備弄個焦頭爛額吧。
方法 2: 是否使用異步處理.
如果在后臺使用異步的方法來執行是否一定會有很大的性能改善呢?
答案是不一定.它取決于后臺運行是否有意義
例如下面這種情況:如果在主線程上使用javascript或者本地代碼進行計算時,性能并不比同步處理更好時,就不一定需要在后臺用異步方法去處理
請閱讀以下代碼
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16function doComputationWork(input, callback) {
// Because the internal implementation of this asynchronous
// function is itself synchronously run on the main thread,
// you still starve the entire process.
var output = doComputationWorkSync(input);
process.nextTick(function() {
callback(null, output);
});
}
function myRequestHandler(request, response) [
// Even though this *looks* better, we're still bringing everything
// to a grinding halt.
doComputationWork(request.somesuch, function(err, results) {
新聞熱點
疑難解答