Google APP Engine - создает новый экземпляр для каждого подключения или не имеет нулевых экземпляров - PullRequest
0 голосов
/ 04 августа 2020

Я заметил кое-что немного странное с Google App Engine. Если мое приложение не использовалось, и я go открываю его, я замечаю, что для его загрузки требуется некоторое время, я также вижу в консоли журналов GAE, что в это время запускается сервер, поэтому учитывается ожидание (почему не всегда работает экземпляр?)

После того, как я пару раз открываю и закрываю приложение, я замечаю на вкладке версий GAE, что у меня есть 7 запущенных экземпляров (все в одной версии).

Я немного запутался в том, как работает GAE, сворачивает ли он ваши экземпляры до 0, когда какое-то время нет запросов, а затем, с другой стороны, запускает ли он новый экземпляр при каждом подключении нового клиента?

мой app.yaml выглядит так:

  runtime: nodejs10
  env: standard

  instance_class: F2

  handlers:
    - url: /.*
      secure: always
      redirect_http_response_code: 301
      script: auto    

Ответы [ 2 ]

1 голос
/ 04 августа 2020

Вам необходимо точно настроить стратегию масштабирования App Engine, например, проверьте этот app.yaml файл

runtime: nodejs10
env: standard
instance_class: F2
handlers:
  - url: /.*
    secure: always
    redirect_http_response_code: 301
    script: auto

automatic_scaling:
  min_instances: 1
  max_instances: 4
  min_idle_instances: 1
  max_concurrent_requests: 25
  target_throughput_utilization: 0.8

inbound_services:
- warmup

min_instances и min_idle_instances установлены на 1, чтобы иметь почти 1 экземпляр готов к входящим запросам и избегает холодного запуска.

Чтобы не запускать новые экземпляры слишком быстро, вы можете установить max_concurrent_requests & target_throughput_utilization, в этом примере новый экземпляр будет раскручиваться, пока экземпляр не достигнет 20 одновременные запросы (25 X 0.8)

Как указано в этом документе , необходимо создать конечную точку разминки в вашем приложении и добавить inbound_services в ваше приложение .yaml файл, например:

app.get('/_ah/warmup', (req, res) => {
    // Handle your warmup logic. Initiate db connection, etc.
});

вызовы разминки несут преимущество подготовки ваших экземпляров перед входящим запросом и уменьшения задержки первого запроса.

1 голос
/ 04 августа 2020

Поскольку вы не указали какие-либо настройки масштабирования в app.yaml, App Engine использует automati c scaling .

Это означает, что приложение имеет минимум 0 экземпляров , поэтому, когда ваше приложение вообще не получает никаких запросов, оно будет уменьшено до 0. С помощью этой опции вы сократите затраты, которые подразумевают постоянную работу экземпляра, но также произойдет холодный запуск. Холодный старт происходит каждый раз, когда запрос достигает вашего приложения, но нет экземпляров, готовых для его обслуживания, и необходимо создать новый.

Что касается масштабирования вашего приложения до 7 экземпляров, когда трафик c загружается увеличивается, это снова зависит от получаемой рабочей нагрузки. Вы также можете контролировать это поведение, используя параметр max_instances, хотя использование низкого значения может повлиять на производительность вашего приложения, если потребуется больше экземпляров.

App Engine будет раскручиваться по новой экземпляры, если достигается пороговое значение на target_cpu_utilization, target_throughput_utilization, max_concurrent_requests, max_pending_latency или min_pending_latency. Обо всех можно прочитать здесь .

...