#node.js #mongodb #docker #google-cloud-run #mongodb-atlas
#node.js #mongodb #docker #google-cloud-run #mongodb-atlas
Вопрос:
Я использую Google Cloud Run уже год, и проблема с перезапуском контейнеров Cloud run / запуском нового контейнера возникает с самого начала.
Я разместил приложение Node MongoDB в Cloud Run, но контейнер cloud run часто перезапускается. Скорость составляет около 10-12 запросов в секунду, не удалось найти узкого места в производительности, запросы обслуживаются бесперебойно, иногда запросы обслуживаются дольше обычного времени, может быть задержка холодного запуска нового экземпляра контейнера.
Проблема, с которой я сталкиваюсь, заключается в БОЛЬШОМ количестве подключений к серверу MONGODB. После некоторых исследований я смог обнаружить, что мне нужно закрыть соединение mongodb при выходе из процесса узла, поэтому я добавил функцию изящного завершения работы.
// Function to terminate the app gracefully:
const gracefulShutdown = async () => {
console.log(`MONGODB CONNECTION CLOSED!`);
await mongoose.connection.close();
};
// This will handle process.exit():
process.on('exit', gracefulShutdown);
// This will handle kill commands, such as CTRL C:
process.on('SIGINT', gracefulShutdown);
process.on('SIGTERM', gracefulShutdown);
// This will prevent dirty exit on code-fault crashes:
process.on('uncaughtException', gracefulShutdown);
Но даже после добавления этого я не смог обнаружить, что эта функция изящного завершения работы вызывается при проверке журналов.
- Действительно ли Google Cloud run сигнализирует о сбое процесса nodejs в контейнере?
- Есть ли какой-либо способ идентифицировать перезапуск контейнера или создание нового экземпляра в Cloud run?
Вот код подключения к MongoDB
exports.connect = () => {
try {
mongoose
.connect(MONGO.URI, {
useCreateIndex: true,
keepAlive: 1,
useNewUrlParser: true,
useUnifiedTopology: true,
useFindAndModify: false,
})
.then((docs) => {
console.log(`DB Connected`);
})
.catch((err) => {
console.log(`err`, err);
});
return mongoose.connection;
} catch (err) {
console.log(`#### Error Connecting DB`, err);
console.log(`Mongo URI: `, MONGO.URI);
}
};
Иногда Cloud run выдает большое количество подключений к MONGODB и достигает предела в 1500 подключений.
Любые предложения приветствуются! Я сталкиваюсь с этой проблемой уже год.
Комментарии:
1. есть ли у вас специальный параметр для запуска в облаке? Особенно параметр параллелизма? У вас есть более подробная информация об этих соединениях? Есть ли у вас сбой экземпляра или неожиданное поведение, которое может привести к этому созданию?
2. Я не вижу в вашем вопросе ничего, что касается запуска, остановки или перезапуска контейнера. Я предполагаю, что происходит то, что вы неправильно создаете клиенты Mongo в своем приложении, и это приводит к тому, что вы подсчитываете количество нерегулярных подключений.
3. Для параллелизма @guillaumeblaquiere установлено значение 80 по умолчанию. Я не смог найти ни одного сбоя экземпляра или неожиданного поведения при проверке журналов отслеживания стека
4. @D.SM Я обновил вопрос с помощью кода подключения, я не уверен, что это вызывает проблему
5. Как и когда вы вызываете свою функцию подключения?
Ответ №1:
Вы не должны запускать процесс узла с помощью npm
или yarn
, а непосредственно как CMD ["node", "index.js"]
(когда вы находитесь внутри контейнера Docker с использованием Dockerfile)
Объяснение здесь https://maximorlov.com/process-signals-inside-docker-containers /