次のアーキテクチャを使用して webapp を構築しています。
- postgresql データベース (DB と呼ばれる)、
- Sequelize を使用して DB を操作し、Epilogue を使用して Express 経由で REST インターフェイスを公開する NodeJS サービス (DBService と呼ばれる)、
- バックエンドとして機能し、DBService を使用する Backend と呼ばれる NodeJS サービスが REST 呼び出しをスローしました
- Backend を使用する Frontend という AngularJS Web サイト
私が使用しているバージョンは次のとおりです。
- PostgreSQL 9.3
- 続編 2.0.4
- エピローグ 0.5.2
- エクスプレス 4.13.3
私の DB スキーマは 36 個のテーブルを含む非常に複雑で、そのうちのいくつかには数百のレコードが含まれています。DB は頻繁にデータを書き込むためのものではなく、主に読み取るためのものです。
しかし最近、DB 内に含まれるデータを完全にチェックするスクリプトをバックエンドで作成しました。基本的に、このスクリプトはすべてのテーブルのすべてのデータを取得し、データに対していくつかの基本的なチェックを行います。現在、スクリプトはデータベースの読み取りのみを行います。
スクリプトを実現するために、オプションを使用して Epilogue のページネーション制限を削除する必要がありました pagination: false( https://github.com/dchester/epilogue#paginationを参照)。
しかし、スクリプトを起動すると、そのようなエラーがランダムに発生しました。
URL http://localhost:3000/CallTypes/178/RendererThemesで一意に関連付けられたオブジェクトを取得しようとしたときに、要求が失敗しました。
コード : -1
メッセージ : エラー: ECONNRESET 127.0.0.1:3000 に接続してください
スクリプトの実行中にエラーがランダムに表示されます。返されるのは常にこの URL ではなく、常に同じテーブルまたはリレーションであるとは限りません。コードの前のエラー メッセージは、バックエンドによって返されるカスタム メッセージです。
logging: console.logURL は DBService への参照ですが、Sequelize で使用しDEBUG=express:*て Express で何が起こるかを確認しても、エラーは表示されません。
バックエンド スクリプトに setTimeout を入れて速度を落とそうとしましたが、実際の変更はありませんでした。また、PostgreSQLmax_connections制限 (制限を 1000 接続に設定) や SequelizemaxConcurrentQueriesとpool値などのさまざまな値を操作しようとしましたが、まだ成功していません。Express のプール接続をカスタマイズできる場所が見つかりませんでした。
エラーは、DBService、Express 構成、または DB の構成のどこか (Sequelize/Epilogue または postgreSQL サーバー自体のいずれか) から発生すると想定していますが、どのログにもエラーが表示されなかったので、わからない。
私がそれを解決するのに役立つアイデアはありますか?
編集
さらに調査した結果、NodeJS ECONNRESET エラーを回避する方法に非常によく似た答えが見つかった可能性があります。 : 自分のオブジェクト RestClient を使用して http 要求を実行しています。このオブジェクトは、次のメソッドでシングルトンとして構築されました。
var NodeRestClient : any = require('node-rest-client').Client;
...
static getClient() {
if(RestClient.client == null) {
RestClient.client = new NodeRestClient();
}
return RestClient.client;
}
その後、私は常に同じオブジェクトを使用してすべてのリクエストを実行していましたが、プロセスが速すぎると衝突が発生しました...そのif(RestClient.client == null)ため、テストを削除したところ、今のところ機能しているようです。それを管理するためのより良い方法がある場合は、リクエストを閉じるか、プールを管理することで、気軽に貢献してください:)