Время жизни стандартного экземпляра GAE

#node.js #google-app-engine #google-cloud-platform #mongodb-atlas

#node.js #google-app-engine #google-облачная платформа #mongodb-atlas

Вопрос:

Чтобы опробовать Google Cloud Platform и Mongodb Atlas, я зарегистрировался на обеих платформах и создал простое приложение, размещенное на App Engine Standard, которое подключается к Atlas.

Устанавливая новый тайм-аут после обновления, каждую минуту он обновляет коллекцию из 5 записей, каждая из которых имеет имя и поле last_updated, обновляя поле last_updated текущей датой.

Кроме того, используя серверную часть Express, приложение показывает дату последнего обновления по URL appspot (она отображается в журнале ниже).

После работы в течение примерно 2 часов контейнер был остановлен сигналом 9. Мне было интересно, в чем причина этого? через 2 часа после его запуска? через 1 час после последнего внешнего вызова? Почему бы ему не продолжать запускать процесс settimeout / express?

Казалось, что объем памяти постоянен (см. Экраны ниже)

Кроме того, как показывает журнал процессора, примерно через 5 минут, похоже, было 0 CPU, в то время как журнал показывает точно такой же результат до завершения работы. Что там происходит?

Журналы: Журналы

Память: Память

Процессор: Процессор

Ответ №1:

Для App Engine standard экземпляр может быть запущен или остановлен.

Службы автоматического масштабирования имеют один или несколько постоянно запущенных экземпляров. Ручные или базовые масштабируемые сервисы могут быть остановлены, когда в них нет трафика. Вы можете настроить поведение масштабирования в app.yaml.

Эта ссылка поможет вам понять жизненный цикл App Engine.

Жизненный цикл экземпляра

По этой ссылке указаны настройки app.yaml для масштабирования:

Масштабирование элементов

Пример app.yaml с автоматическим масштабированием:

 service: my-service
runtime: python27
api_version: 1
instance_class: F2
automatic_scaling:
  target_cpu_utilization: 0.65
  min_instances: 5
  max_instances: 100
  min_pending_latency: 30ms  # default value
  max_pending_latency: automatic
  max_concurrent_requests: 50
  

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

1. Спасибо за ссылку. Насколько я понимаю, мне понадобится min_instances: 1 для продолжения непрерывного цикла setTimeout?

2. Да, с тем ограничением, что я не знаю, что ваш код делает в фоновом режиме. Наилучшая стратегия заключается в том, чтобы ваше приложение App Engine обрабатывало запуски, перезапуски и завершения. App Engine разработан для веб-приложений, которые запускаются на основе запросов (попадание на веб-страницу), которые имеют короткое время жизни. Для приложений на основе фоновых заданий App Engine может оказаться не лучшим выбором.

3. Кроме того, для моего примера мне, вероятно, потребуется разделить цикл express и setTimeout на два разных контейнера, чтобы первый мог масштабироваться до трафика, а второй быть ограничен только одним экземпляром, выполняющим фоновую работу. Используя min_instances: 1 и max_instances: 1, чтобы не было нескольких фоновых процессов?

4. Кроме того, воспользуйтесь калькулятором цен Google Cloud, чтобы сравнить затраты между GAE и GCE, где GAE всегда запускает экземпляр. cloud.google.com/products/calculator

5. Закройте этот вопрос, поскольку на вашу исходную проблему получен ответ. Откройте новые вопросы по указанным проблемам (по одному на вопрос).