10

背景: Amazon クラウドで Express と Mongoose を使用して構築した Node.js API の速度を最適化しようとしています。実行にかなりの時間がかかる API 呼び出しが 1 つあります (私の /stats API 呼び出しは、多くのソースからデータをコンパイルするため、何百もの mongo クエリを作成するため、実行に約 20 秒かかります)。この API 呼び出しの実行中に、Mongo レプリカ セットにもヒットする他の A​​PI 呼び出しの戻りが遅いことに気付きました。最初に考えたのは、統計クエリが遅いためにブロックされているということでしたが、私の統計パネルによると、実行に 100 ミリ秒を超えるクエリはなく、Mongo DB の統計もすべてかなり健全な範囲内にあります (1 回あたり 20 以上のクエリ)。 2 番目、<1% の btree ミス、<5% のロック)。

質問: 現在、私の Node.js アプリは起動時に Mongo セットへの単一の接続を確立し、すべてのクエリがその接続を使用します。複数の接続を確立した方がよいでしょうか? たとえば、代わりに、インバウンド API リクエストごとに新しい Mongo 接続を確立する必要がありますか? または、レプリカ セットへの静的な数の接続と、クエリの実行時にそれらの接続間の負荷分散を行う必要がありますか?

それとも、私は完全に基地外ですか?

4

1 に答える 1

15

絶対に複数の接続を使用する必要があります。そうしないと、一度に実行できるクエリは 1 つだけです。これを行う最もクリーンな方法は、mongodb.Serverオブジェクトの作成時にオブジェクトで接続プールを有効にするDbことです。例えば:

var serverOptions = {
    'auto_reconnect': true,
    'poolSize': 5
};

var mdb = new mongodb.Db('test', new mongodb.Server('127.0.0.1', 27017, serverOptions));
mdb.open(function (err, mdb) { ... }

統計に遅いクエリ時間が表示されない理由は、同時クエリが、接続が利用可能になるのを待っているクライアント側で単にキューに入れられているためです. その待機時間は、サーバー側のクエリ時間には表示されません。

于 2012-10-08T20:53:26.260 に答える