将文件从Google App Engine存储上传到Google Cloud Storage时发生超时错误

时间:2018-10-29 19:08:44

标签: python-2.7 google-app-engine google-cloud-storage

我正在通过以下代码从App Engine上传大于10MB的文件到Google Cloud Storage。

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

我使用的是GCS Python客户端库,而不是内置的App Engine库,因为该过程完成后,我会将多个10MB以上的文件组合到Cloud Storage中的单个文件中。

代码正在任务中运行,并且有10分钟的时间来获取数据并将信息以CSV格式上传到GCS。在不到3分钟的时间内检索数据并将其转换为CSV格式的字符串。然后,代码尝试将数据上传到GCS,Stackdriver日志记录停止接收日志,我等待约10分钟,这时我在Stackdriver中收到大量日志,直到出现故障为止,而失败的原因是:

  

DeadlineExceededError:已超过响应HTTP请求的总期限。

由于两件事,这个问题令人沮丧。

  1. 此错误是间歇性的。
  2. 一旦1个文件成功,它们都将在数秒内成功。

    1. 在最初开发过程中,从未发生此问题。直到最近这个问题才开始出现,并且变得越来越普遍。

    2. 第一> 10MB文件总是需要几分钟才能失败或成功。 10分钟后失败,但可能需要1到9分钟(分钟),然后成功。文件成功后,以后所有大于10MB的文件的上传将花费大约5-10

我的理论是,App Engine使用某些服务将文件上传到Google Cloud Storage,该服务在一段时间不使用后会自动进入睡眠状态。当服务处于睡眠状态时,需要很长时间才能将其唤醒。服务唤醒后,可以非常快速地将其上传到GCS。

有没有其他人遇到这个问题或对如何解决有想法?

更新

完整错误:

(/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 :(得分:0)

所以“ 10分钟后失败”听起来与我前一段时间遇到的问题非常相似,有时新实例上的进程会挂起,直到它们死了才超时而死:

app engine instance dies instantly, locking up deferred tasks until they hit 10 minute timeout

您可以提供完整的追溯吗?并尝试按日志中的实例ID进行过滤,以查看是否有其他事件同时崩溃。

一些可以尝试的通用快速修复方法是:

  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
  4. 竞争资源。