Увеличьте время запуска кода для гибкого механизма приложений Google, задерживающего DeadlineExceededError - PullRequest
0 голосов
/ 03 июня 2018

У меня есть одна функция, работающая в Google App Engine Flexible, как часть вызова API.Структура выглядит примерно так:

import externalmod
...
...

@app.route('/calc_here')
def calc:
answer = externalmod.Method()

return answer

Функция externalmod - это сложный алгоритм (не хранилище данных, не urlfetch, просто чистый Python), который работает для каждого возможного случая на рабочем столе, но для некоторых входных случаев наМеханизм приложения, когда вызывается конечная точка, выдает следующую ошибку

{
 "code": 13,
 "message": "BAD_GATEWAY",
 "details": [
  {
   "@type": "type.googleapis.com/google.rpc.DebugInfo",
   "stackEntries": [],
   "detail": "application"
  }
 ]
}

После просмотра https://cloud.google.com/appengine/articles/deadlineexceedederrors и следующих обсуждений: Как увеличить таймер запроса Google App Engine.По умолчанию установлено значение 60 с

и https://groups.google.com/forum/#!topic/google-appengine/3TtfJG0I9nA

. Я понял, что это происходит из-за того, что движок приложения остановится, если выполнение какого-либо кода длится более 60 секунд.Сначала я попытался сделать следующее в соответствии с Должно ли Exception перехватывать исключения DeadlineExceededError?

from google.appengine.runtime import DeadlineExceededError
try:
   answer = externalmod.Method()
except DeadlineExceededError:
   answer = some_default

, но я получил ошибку, что нет модуля google.appengine

, а затемпонимая, что все документы предназначены для стандартной среды, но я использую гибкую среду, я считаю, что appengine.runtime, вероятно, даже больше не существует. Когда я сделал это:

 try:
   answer = externalmod.Method()
 except :
   answer = some_default

, это сработало, и я начал ловить некоторые DeadlineExceededErrors,Но, видимо, я не всегда могу поймать DeadlineExceededErrors как это.Как иногда я ловлю ошибку, а иногда нет.Я подумал, что лучшим способом было бы увеличить количество времени, которое разрешено выполнять коду, а не просто перехватывать исключение.

Я пытался изменить файл app.yaml, добавив CPU: 2, но ничего не изменилось.

runtime_config:
python_version: 3
resources:
  cpu: 2
  memory_gb: 4
manual_scaling:
  instances: 1

Может быть, этот вопрос Taskqueue для длительных задач в движке приложения FLEXIBLE

также может иметь аналогичный ответ, но я понятия не имею, что такое Taskqueue, а такжеЯ не могу ничего поставить в очередь, так как критическая функция, которую я выполняю, автономна, и я не хочу разбивать ее только на некоторые случаи.Мне было бы проще увеличить предел 60 с.Как я могу это сделать?

1 Ответ

0 голосов
/ 04 июня 2018

Так как я не получил никакого ответа, я продолжил поиск.Я понимаю, что у многих других также есть подобные проблемы.

Первое, на что следует обратить внимание, - это то, что гибкая среда GAE не имеет большинства стандартных ограничений, как в стандартной среде.Это означает, что DeadlineExceededError не существует, поскольку не существует крайнего срока 60 секунд.Все модули и коды работают так же, как и на любом компьютере, поскольку все они содержатся в контейнерах Docker.

https://cloud.google.com/appengine/docs/flexible/python/migrating

Кроме того, отсутствует модуль google.appengine.В зависимости от используемого языка все облачные взаимодействия должны происходить через google.cloud API https://cloud.google.com/apis/docs/overview

Тогда что может объяснить этот тайм-аут?Я проверил логи-логи в консоли проекта облака Google.Я увидел, что соответствующая ошибка на самом деле [CRITICAL] WORKER TIMEOUT, которая произошла ровно через 30 секунд после вызова функции.Это не имеет ничего общего с GAE flex, но с серверной платформой.В моем случае "Gunicorn".

Ответ здесь приводится на самом деле https://serverfault.com/questions/490101/how-to-resolve-the-gunicorn-critical-worker-timeout-error/627746

В основном, с использованием документации http://docs.gunicorn.org/en/latest/settings.html#config-file

единственное необходимое изменение будет в файле app.yaml

где раньше это было

runtime: python
env: flex
entrypoint: gunicorn -b :$PORT main:app

у рабочих-оружейников установлен тайм-аут по умолчанию на 30 секунд

измените его на

entrypoint: gunicorn -t 120 -b :$PORT main:app

здесь тайм-аут составляет 120 секунд, нов зависимости от проб и ошибок он может быть оптимизирован.Это, однако, решило мою конкретную проблему запуска кода, который занимает больше времени, чем обычно

...