ArangoDB と PostgreSQL を使用して、ほぼ同一のデータを保存します。PostgreSQL は、リレーショナル データベースが適切に実行できる一般的なタイプのクエリを実行するために使用されます。ArangoDB は、グラフ トラバーサル、最短パスの検索などの種類のクエリを実行するために選択されました。
現時点では、PostgreSQL に 160000 レコードのテーブルがあり、ArangoDB に同じ量のドキュメントがあるコレクションがあります。
私たちが取り組んでいる API は同時に複数のユーザーによって使用されるため、最初に確認したかったのは、ArangoDB と PostgreSQL の両方が負荷の下でどのように動作するかということでした。ワークロードとして、ArangoDB と PostgreSQL の両方に対してフィルターを使用して単純な選択クエリを実行する単純な負荷テストを作成しました。
クエリは、日付フィールドによるフィルターで上位 N のレコード/ドキュメントを選択します。
負荷テストを実行すると、PostgreSQL へのすべてのクエリが 0.5 秒以内に実行されます。ユーザー数を 10 から 100 に増やしても、実行時間にはまったく影響しません。
ArangoDB への同じクエリは、1 人のユーザーで開始すると約 2 秒かかります。その後、応答時間は同時ユーザーの数に正比例して増加します。同時ユーザー数が 30 の場合、応答を 60 秒間待機すると、すべてのクエリがタイムアウトになります。
arangojs コネクタをデバッグしようとしたところ、次のことがわかりました。
var maxTasks = typeof agent.maxSockets === 'number' ? agent.maxSockets * 2 : Infinity;
この:
Connection.agentDefaults = {
maxSockets: 3,
keepAlive: true,
keepAliveMsecs: 1000
};
これは、デフォルトの arangojs の動作が、同時に ArangoDB に 6 つ以下の同時クエリを送信することであることを意味します。これにより、残りのすべてのクエリが Node.js 側でキューに入れられます。数を増やそうとしましたが、役に立ちませんでした。現在、すべてのクエリが ArandoDB 側でキューに入れられているようです。ここで、ロードを実行し、ArangoDB Web Interface を使用していくつかのクエリを実行しようとすると、(その時点でのユーザーの数に応じて) 予測できない時間がクエリに渡され、結果が返され、実行されたことが示されます。約 4 秒で、これは正しくありません。私にとっては、他のすべてのクエリがキューに入れられている間、ArangoDBは一度に1つのクエリしか実行できないようです...
何か不足していますか?ArangoDB を調整して、負荷がかかった状態でのパフォーマンスを向上させる設定はありますか?
アップデート:
ArangoDB 3.0 を使用し、1.5 GB の RAM を備えた Docker コンテナー (公式イメージから) として実行します。
サンプル ドキュメント (約 16,000 個あります):
{
"type": "start",
"from_date": "2016-07-28T10:22:16.000Z",
"to_date": "9999-06-19T18:40:00.000Z",
"comment": null,
"id": "13_start",
"version_id": 1
}
AQL クエリ:
FOR result IN @@collection
FILTER (result.version_id == 1)
FILTER (result.to_date > '2016-08-02T15:57:45.278Z')
SORT result._key
LIMIT 100
RETURN result