500 в Google Cloud Run: запрос не выполнен из-за невозможности успешного запуска экземпляра - PullRequest
3 голосов
/ 12 ноября 2019

Я выполняю нагрузочное тестирование в приложении ExpressJS, размещенном в Google Cloud Run, при резком увеличении трафика наблюдается период, когда я вижу много 500 ошибок в Stackdriver с сообщением «Запрос не выполнен, так как экземпляр не может запуститьсяуспешно."- что фактически приводит к простою сервера.

Учитывая, что эта ошибка возникает чаще по мере масштабирования приложения, я думаю, что это вызвано балансировщиком нагрузки Cloud Run, который преждевременно назначает трафик новым экземплярам, ​​прежде чем эти экземплярыготовы принимать запросы.

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

Я не вижу никаких журналов ошибок из моего приложения NodeJS, указывающих на то, что ни один из неудавшихся запросов фактически не достиг моего приложения.

Что я могу сделать, чтобы избежать этих ошибок?

Как определяет Cloud Runчто порт готов к приему запросов?

Это что-то, что я неправильно настроил в своем приложении ExpressJS, или я могу как-то немного задержать Cloud Run перед отправкой запросов новому экземпляру?

1 Ответ

5 голосов
/ 17 ноября 2019

Это, как оказалось, было вызвано сочетанием максимального ограничения экземпляра автоматического масштабирования Cloud Run и ограничения подключения Cloud SQL.

Я запускал небольшой экземпляр Cloud SQL Postgres (3,75 ГБ / 1 vCPU), которыйпоставляется с пределом подключения по умолчанию, равным 100. (https://cloud.google.com/sql/docs/quotas)

По умолчанию Cloud Run назначает максимальное количество экземпляров 1000 для автоматического масштабирования. Во время нагрузочного теста внезапный скачок числа запросов толкает автомасштабирование для создания сотен экземпляров, что быстро исчерпало лимит соединения Cloud SQL, равный 100.

Этот точный сценарий задокументирован для Cloud SQL: https://cloud.google.com/sql/docs/postgres/connect-run#connection_limits_3 (было бы неплохо, если бы это также было задокументированов Cloud Run мне не сразу приходилось искать документацию по Cloud SQL, когда возникла эта проблема)

Решение - это комбинация ограничения максимального числа экземпляров в Cloud Run числом, которое допустимо,и корректировка распределения ресурсов / максимального лимита подключения в Cloud SQL. Точная конфигурацияОчевидно, n будет зависеть от ожидаемого уровня нагрузки.

...