Почему Google Cloud запускает массовый перезапуск контейнера / создание нового экземпляра?

#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 запросов в секунду, не удалось найти узкого места в производительности, запросы обслуживаются бесперебойно, иногда запросы обслуживаются дольше обычного времени, может быть задержка холодного запуска нового экземпляра контейнера.

Перезапуск контейнера Google Cloud Run Container

Проблема, с которой я сталкиваюсь, заключается в БОЛЬШОМ количестве подключений к серверу 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);
  

Но даже после добавления этого я не смог обнаружить, что эта функция изящного завершения работы вызывается при проверке журналов.

  1. Действительно ли Google Cloud run сигнализирует о сбое процесса nodejs в контейнере?
  2. Есть ли какой-либо способ идентифицировать перезапуск контейнера или создание нового экземпляра в 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 подключений.

Проблема с высоким подключением Google Cloud Run MongoDB

Любые предложения приветствуются! Я сталкиваюсь с этой проблемой уже год.

Комментарии:

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 /