【问题标题】:Timeout Error When Uploading File from Google App Engine Storing to Google Cloud Storage将文件从 Google App Engine Storing 上传到 Google Cloud Storage 时出现超时错误
【发布时间】:2019-04-02 18:47:58
【问题描述】:

我正在通过以下代码将 >10MB 的文件从 App Engine 上传到 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.

【问题讨论】:

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


    【解决方案1】:

    因此,“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

    【讨论】:

    • 1.即使实例已经启动了一段时间,问题仍然存在。 2.我用的是F4_1G的最高实例。 3.当任务是唯一运行的任务时,问题仍然存在。
    • 嗯,是的,我不确定。当您说The code is running in a task and has 10 minutes to get the data 时,它从哪里获取数据?任务队列和应用程序引擎通常适用于处理大量小任务。我使用 Google Dataflow 将 Datastore 记录作为 100MB CSV 文件导出到 GCS。如果可以的话,你应该使用它,如果没有,那么可能会查看 GAE Flex,在那里你将拥有更多的控制权和更长的超时时间。
    • 谢谢亚历克斯。我正在从 G Suite 目录 API 中提取数据。我正在批量处理 20,000 个用户,将 JSON 返回转换为 CSV 格式的字符串,然后将 CSV 字符串保存在 GCS 中。我已经确定超时是因为从 JSON 转换为 CSV。由于某种原因,处理能力波动很大。我运行了一个测试,转换为 CSV 花了 8 分钟,然后立即再次运行,花了 3 分钟。我的解决方案是将批次从 20,000 减少到 10,000。希望这将确保大幅波动保持在 10 分钟内。
    猜你喜欢
    • 2020-03-24
    • 2020-04-04
    • 2014-11-22
    • 1970-01-01
    • 2013-11-02
    • 2021-11-05
    • 2015-07-07
    • 2013-06-27
    • 1970-01-01
    相关资源
    最近更新 更多