我正在通过以下代码从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个文件成功,它们都将在数秒内成功。
在最初开发过程中,从未发生此问题。直到最近这个问题才开始出现,并且变得越来越普遍。
第一> 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.
答案 0 :(得分:0)
所以“ 10分钟后失败”听起来与我前一段时间遇到的问题非常相似,有时新实例上的进程会挂起,直到它们死了才超时而死:
app engine instance dies instantly, locking up deferred tasks until they hit 10 minute timeout
您可以提供完整的追溯吗?并尝试按日志中的实例ID进行过滤,以查看是否有其他事件同时崩溃。
一些可以尝试的通用快速修复方法是: