IvanBlacky
@IvanBlacky
back-end разработчик

Почему Mongoose уничтожает пул подключений?

Всем привет!
Столкнулся с такой проблемой: в непредсказуемый момент процесс Node.js при запросе на поиск в базе через mongoose падает с ошибкой
MongoError: pool destroyed
    at Pool.write (/usr/src/app/node_modules/mongoose/node_modules/mongodb/lib/core/connection/pool.js:853:8)
    at _command (/usr/src/app/node_modules/mongoose/node_modules/mongodb/lib/core/wireprotocol/command.js:127:10)
    at command (/usr/src/app/node_modules/mongoose/node_modules/mongodb/lib/core/wireprotocol/command.js:27:5)
    at Object.query (/usr/src/app/node_modules/mongoose/node_modules/mongodb/lib/core/wireprotocol/query.js:57:3)
    at Server.query (/usr/src/app/node_modules/mongoose/node_modules/mongodb/lib/core/topologies/server.js:639:16)
    at FindOperation.execute (/usr/src/app/node_modules/mongoose/node_modules/mongodb/lib/operations/find.js:24:12)
    at topology.selectServer (/usr/src/app/node_modules/mongoose/node_modules/mongodb/lib/operations/execute_operation.js:164:17)
    at Server.selectServer (/usr/src/app/node_modules/mongoose/node_modules/mongodb/lib/core/topologies/server.js:827:3)
    at Server.selectServer (/usr/src/app/node_modules/mongoose/node_modules/mongodb/lib/topologies/topology_base.js:363:32)
    at executeWithServerSelection (/usr/src/app/node_modules/mongoose/node_modules/mongodb/lib/operations/execute_operation.js:150:12)
    at executeOperation (/usr/src/app/node_modules/mongoose/node_modules/mongodb/lib/operations/execute_operation.js:81:16)
    at Cursor._initializeCursor (/usr/src/app/node_modules/mongoose/node_modules/mongodb/lib/core/cursor.js:545:7)
    at Cursor._initializeCursor (/usr/src/app/node_modules/mongoose/node_modules/mongodb/lib/cursor.js:191:11)
    at nextFunction (/usr/src/app/node_modules/mongoose/node_modules/mongodb/lib/core/cursor.js:748:10)
    at Cursor._next (/usr/src/app/node_modules/mongoose/node_modules/mongodb/lib/core/cursor.js:202:5)
    at fetchDocs (/usr/src/app/node_modules/mongoose/node_modules/mongodb/lib/operations/to_array.js:27:14) name: 'MongoError', [Symbol(mongoErrorContextSymbol)]: {} }


Сама MongoDB жива и healthcheck сообщает о статусе healthy
Баг повторяется в разных приложениях, в разные моменты, в разных местах. После перезапуска процесса Node.js переподключение происходит нормально. Через некоторое время процесс опять падает.

Настройки mongoose все дефолтные, кроме poolSize, который выставлен на 250.

Сетап сервиса: Node.js и MongoDB в Docker при помощи docker-compose.
Образ Node.js-сервиса собирается из node:10
Образ MongoDB -- mongo:latest (на данный момент: 4.2.3)
Используется mongoose версии 5.7.5
  • Вопрос задан
  • 695 просмотров
Решения вопроса 1
zoonman
@zoonman
⋆⋆⋆⋆⋆
Иван Чернышев, есть подозрение, что вы где-то делаете db.close() раньше, чем завершена операция.

Это как работает пул https://mongodb.github.io/node-mongodb-native/core...

После чтения исходников https://github.com/mongodb-js/mongodb-core/blob/ma... можно понять, что пул разрушается, когда заканчиваются сокеты или наступает лимит попыток пересоединений.

Mongoose достаточно старый, они фиксили там ошибки. Попробуйте его обновить.

Еще включите отладку в монгусе.
mongoose.set('debug', true)
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@Che603000
c 2011 javascript
poolSize, который выставлен на 250.

Дефолтное значение равно 5. Вы выставили значение в 50 раз превышающее рекомендованные. Видимо для этого у Вас были веские причины.
Если не секрет то какие ? Возможно ли уменьшить количество соединений? Падает ли в этом случае pool ?
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы