Node.js と Mongo を使用するのはこれが初めてなので、無知をお許しください。私はPHPのバックグラウンドから来ました。Node.js はイベント ドリブンな性質を持っているため、うまくスケーリングできると理解していました。そのため、ノードで API を構築し、ローカルホストでテストしています。今日、それをクラウドサーバーにデプロイしましたが、すべてがうまく機能します...
リクエストが山積みになると、完了するまでに長い時間がかかり始めます。API に接続しているクライアントが 2 つしかない場合でも、両方のクライアントが一度に複数のリクエストを作成しようとすると、ページの読み込み時間が 30 秒以上かかります (これは時々発生します)。
API によって行われる作業のほとんどは、(a) クラウド上の 2 番目のサーバーに存在する MongoDB への読み取り/書き込み、(b) 他の API や Web サイトなどに要求を行い、結果を返すことのいずれかです。これらの操作は両方ともブロックされるべきではありませんが、問題は Mongo DB サーバー (a) または外部 API (b) のいずれかのボトルネックに関係していると想像できます。
もちろん、最終的には複数のアプリケーション サーバーを用意することになりますが、それぞれのサーバーが 2 つ以上の同時クライアントを窒息させることなく処理できることを期待しています。
いくつかの考慮事項: 1) ノード コードに残したいくつかの console.logs があり、クラウド サーバーを監視するために SSH クライアントを開いています。これにより速度が低下する可能性があると思われます 2)エクスプレス、マングース、Q、リクエスト、およびその他のいくつかのモジュールを使用しています
ノードnewbを支援するために時間を割いていただきありがとうございます;)
編集:以下のいくつかの応答の後にパフォーマンスグラフの写真を追加しました...
編集: これは典型的なコールバックです。高速ルーターによって呼び出され、Q モジュールと OAuth を使用して Facebook への Post API 呼び出しを行います。
post: function(req, links, images, callback)
{
// removed some code that calculates the target (string) and params (obj) variables
// the this.request function is a simple wrapper around the oauth.getProtectedResource function
Q.ncall(this.request, this, target, 'POST', params)
.then(function(res){
callback(null, res);
})
.fail(callback).end();
},
編集: いくつかの「アップサート」コード
upsert: function(query, callback)
{
var id = this.data._id,
upsertData = this.data.toObject(),
query = query || {'_id': id};
delete upsertData._id;
this.model.update(query, upsertData, {'upsert': true}, function(err, res, out){
if(err)
{
if(callback) callback(new Errors.Database({'message':'the data could not be upserted','error':err, 'search': query}));
return;
}
if(callback) callback(null);
});
},
確かに、Q/promises に関する私の知識は弱いです。しかし、ブロックしない方法で一貫して実装していると思います...