Ошибка тайм-аута при загрузке файла из Google App Engine с сохранением в Google Cloud Storage - PullRequest
0 голосов
/ 29 октября 2018

Я загружаю файл размером более 10 МБ из App Engine в Google Cloud Storage с помощью приведенного ниже кода.

gcs.bucket(bucket_name).blob(blob_name=file_path).upload_from_string(data, content_type=content_type)

Я использую клиентскую библиотеку Python GCS, а не встроенную библиотеку App Engine, потому что я собираю несколько файлов размером более 10 МБ в один файл в облачном хранилище после завершения процесса.

Код выполняется в задаче и имеет 10 минут для получения данных и загрузки информации в формате CSV в GCS. Данные извлекаются и преобразуются в строку в формате CSV менее чем за 3 минуты. Затем код пытается загрузить данные в GCS, ведение журнала Stackdriver прекращает прием журналов, и я жду ~ 10 минут, после чего я получаю поток журналов в Stackdriver вплоть до точки сбоя со сбоем:

DeadlineExceededError: Общий срок ответа на HTTP-запрос превышен.

Эта проблема расстраивает из-за 2 вещей.

  1. Эта ошибка периодически.
  2. Как только 1 файл успешен, все они преуспевают в секундах.

    1. Во время начальной разработки проблема никогда не возникала. Только недавно проблема начала появляться и становится все более частой.

    2. Файл first > 10MB всегда занимает несколько минут, чтобы завершиться неудачно или успешно. Сбой через 10 минут, но может занять от 1 до 9 минут и затем завершиться успешно. После успешного завершения файла все последующие загрузки файлов размером> 10 МБ займут ~ 5-10 секунд .

Моя теория состоит в том, что существует некоторый сервис, который App Engine использует для загрузки файлов в Google Cloud Storage, который автоматически переходит в спящий режим после определенного времени простоя. Когда служба спит, требуется очень много времени, чтобы разбудить ее. Когда служба активна, она может быстро и без проблем загружать ее в GCS.

Кто-нибудь еще сталкивался с этим или есть идеи, как его решить?

UPDATE

Полная ошибка:

(/base/alloc/tmpfs/dynamic_runtimes/python27g/3b44e98ed7fbb86b/python27/python27_lib/versions/1/google/appengine/runtime/wsgi.py:279) Traceback (most recent call last): File "/base/alloc/tmpfs/dynamic_runtimes/python27g/3b44e98ed7fbb86b/python27/python27_lib/versions/1/google/appengine/runtime/wsgi.py", line 267, in Handle result = handler(dict(self._environ), self._StartResponse) File "/base/data/home/apps/s~pg-gx-n-app-200716/worker:20181030t154529.413639922318911836/lib/flask/app.py", line 2309, in __call__ return self.wsgi_app(environ, start_response) File "/base/data/home/apps/s~pg-gx-n-app-200716/worker:20181030t154529.413639922318911836/lib/flask/app.py", line 2292, in wsgi_app response = self.full_dispatch_request() File "/base/data/home/apps/s~pg-gx-n-app-200716/worker:20181030t154529.413639922318911836/lib/flask/app.py", line 1813, in full_dispatch_request rv = self.dispatch_request() File "/base/data/home/apps/s~pg-gx-n-app-200716/worker:20181030t154529.413639922318911836/lib/flask/app.py", line 1799, in dispatch_request return self.view_functions[rule.endpoint](**req.view_args) File "/base/data/home/apps/s~pg-gx-n-app-200716/worker:20181030t154529.413639922318911836/worker.py", line 277, in cache_records cache_module.save_records(records=records, report_fields=report.report_fields, report_id=report.report_id, header=header_flag) File "/base/data/home/apps/s~pg-gx-n-app-200716/worker:20181030t154529.413639922318911836/storage/user/user.py", line 110, in save_records user_entry = User.__generate_user_csv(user=user, report_fields=report_fields) File "/base/data/home/apps/s~pg-gx-n-app-200716/worker:20181030t154529.413639922318911836/storage/user/user.py", line 55, in __generate_user_csv for index, attrib in enumerate(report_fields): DeadlineExceededError: The overall deadline for responding to the HTTP request was exceeded.

1 Ответ

0 голосов
/ 31 октября 2018

Так что «сбой через 10 минут» звучит очень похоже на проблему, с которой я столкнулся некоторое время назад, когда иногда процессы в новом экземпляре просто зависали до истечения времени ожидания перед смертью:

Экземпляр ядра приложения мгновенно умирает, блокируя отложенные задачи до истечения 10-минутного тайм-аута

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

Вот некоторые общие быстрые исправления:

  1. реализация разогревающих запросов https://cloud.google.com/appengine/docs/standard/python/configuring-warmup-requests
  2. увеличение размера вашего экземпляра класса https://cloud.google.com/appengine/docs/standard/#instance_classes
  3. Изолировать эту задачу для запуска на отдельном микросервисе, чтобы ей не приходилось конкурировать за ресурсы с остальными вашими обработчиками запросов https://cloud.google.com/appengine/docs/standard/python/microservices-on-app-engine
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...