NodeJS/Express: ECONNRESET при выполнении нескольких запросов с использованием Sequelize/Epilogue
Я строю веб-приложение, используя следующую архитектуру:
- база данных postgresql (называется DB),
- сервис NodeJS (называемый DBService), использующий Sequelize для манипулирования БД и Epilogue для предоставления интерфейса REST через Express,
- служба NodeJS, называемая Backend, служащая в качестве серверной части и использующая DBService, генерировала вызовы REST.
- веб-сайт AngularJS под названием Frontend, использующий Backend
Вот версия, которую я использую:
- PostgreSQL 9.3
- Sequelize 2.0.4
- Эпилог 0.5.2
- Экспресс 4.13.3
Моя схема БД довольно сложна и содержит 36 таблиц, а некоторые из них содержат несколько сотен записей. БД предназначена не для записи данных очень часто, а главным образом для их чтения.
Но недавно я создал скрипт в Backend для полной проверки данных, содержащихся в БД: в основном этот скрипт извлекает все данные всех таблиц и выполняет некоторые базовые проверки данных. В настоящее время скрипт только читает в базе данных.
Чтобы выполнить мой сценарий, я должен был убрать ограничение нумерации страниц Эпилога, используя опцию pagination: false
(см. https://github.com/dchester/epilogue).
Но теперь, когда я запускаю свой скрипт, я случайно получаю такую ошибку:
Запрос не выполнен при попытке получить уникально связанные объекты с URL: http://localhost:3000/CallTypes/178/RendererThemes.
Код: -1
Сообщение: ошибка: подключите ECONNRESET 127.0.0.1:3000
Ошибка случайно появляется во время выполнения скрипта: тогда возвращается не всегда этот URL, и даже не всегда одни и те же таблицы или отношения. Сообщение об ошибке перед кодом является пользовательским сообщением, возвращаемым Backend.
URL является ссылкой на DBService, но я не вижу в этом никакой ошибки, даже используя logging: console.log
в продолжении и DEBUG=express:*
чтобы увидеть, что происходит в Express.
Я попытался добавить setTimeout в свой скрипт Backend, чтобы замедлить его без каких-либо реальных изменений. Я также пытался манипулировать различными значениями, такими как PostgreSQL max_connections
предел (я устанавливаю ограничение на 1000 подключений), или Sequelize maxConcurrentQueries
а также pool
ценности, но пока безуспешно. Я не нашел, где можно настроить подключение пула Express, возможно, это должно сработать.
Я предполагаю, что ошибка происходит от DBService, от конфигурации Express или где-то в конфигурации БД (либо в 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)
и пока что это похоже на работу. Если есть лучший способ управлять этим, закрыв запрос или управляя пулом, не стесняйтесь вносить свой вклад:)