2

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を支援するために時間を割いていただきありがとうございます;)


編集:以下のいくつかの応答の後にパフォーマンスグラフの写真を追加しました... アパッチ接続 CPU使用率


編集: これは典型的なコールバックです。高速ルーターによって呼び出され、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 に関する私の知識は弱いです。しかし、ブロックしない方法で一貫して実装していると思います...

4

1 に答える 1

3

あなたの質問は、関連データの半分、つまりテクノロジースタックを提供しました。ただし、パフォーマンスの問題をデバッグする場合は、データの残りの半分であるパフォーマンスメトリックも必要です。

いくつかの「クラウドサーバー」を実行していますが、これらのサーバーが実際に何をしているのかは明確ではありません。それらはCPUにスパイクされていますか?メモリ上?IOで?

潜在的な問題がたくさんあります。Expressを実稼働モードで実行していますか?MongoDBサーバーでIOを使いすぎていませんか?合法的に大量のデータをダウンロードしていませんか?無限のNode.JSループに巻き込まれましたか?(それは起こります)

より良いアドバイスを提供したいと思いますが、関係するサーバーのステータスを知らなければ、特定の基盤となるテクノロジーを選択し始めることは本当に不可能です。あなたは「ノード初心者」かもしれませんが、基本的なサーバー監視はプログラミング言語全体でかなり標準的です。


詳細をありがとうございます。上記のコメントの最も重要な部分を繰り返します。これらのサーバーはどこでブロックされていますか?

  • CPU?(明らかにグラフからではありません
  • メモリー?(ここではありそうにないようです
  • IO?(IOグラフはどこにありますか、DBサーバーは何をしていますか?
于 2012-07-18T18:17:52.450 に答える