2016-08-07 16 views
0

以下のコードでnodeJSアプリケーションを起動し、ブラウザからhttp://localhost:3222/を起動すると、アプリケーションは応答を返すのに2000ms以上かかります。ビジネスロジックの実行に時間がかかる(2000ms)場合、nodeJSは同時リクエストを処理する方法

var http = require('http'); 

http.createServer(function (req, res) { 
    res.writeHead(200, {'Content-Type': 'text/plain'}); 
    res.end(fib(40).toString()); 
}).listen(3222, '127.0.0.1'); 


function fib(n) { 
    if (n <= 1) { 
    return n; 
    } 
    return fib(n-1) + fib(n-2); 
} 

私はApacheベンチを使用してURLに同時にアクセスしようとしましたが、リクエストは同時に発生するのではなく深刻な方法で実行されていました。

>ab -n 3 -c 1 http://localhost:3222/ 
1724ms (longest request) 

は深刻な方法で3要求を発生し、平均および最大時間に各採取1713msは1724ms

>ab -n 3 -c 3 http://localhost:3222/ 
5195ms (longest request) 

が同時方法で3要求を焼成し、平均および最大時間に各採取3483msは5195msです。

上記のタイミングは、要求がノード・サーバーによって同時に実行されないことを明確に示しています。

私の質問は、これらのシナリオをプロダクションnodeJSアプリケーションでどのように扱うべきかです。

注:コードはあくまでも表現目的のためのものです。メインスレッドをブロックせずにnodeJSアプリケーションで時間のかかる複雑なビジネスロジックを処理する方法を知りたいと思います。

答えて

0

テストケースの問題点は次のとおりです。Node.jsはシングルスレッドです。非ブロッキングI/Oには非同期関数が使用されています。データベースクエリやファイルの書き込みなどが完了するのを待つことができ、その間に他の処理を行うことができます。しかし、コードの実行に時間がかかる場合は、このコードの実行が終了するまで、他のすべてのアクションが延期されます。

node.jsアプリケーションのインスタンスを複数起動し、haproxyなどのプログラムで負荷分散を行うことができます。しかし、実際の唯一の解決策は、リクエスト処理から計算を切り離すことです。

関連する問題