L. *_*zie 2 python google-cloud-storage google-cloud-platform google-cloud-functions
我有一堆存储桶,它们在文件上传时向 Pub/Sub 主题发布通知。然后,我有一个订阅 Pub/Sub 主题的云函数,它将这些文件复制到其最终目标存储桶。对于大多数文件来说,这一切都很好,但是当我有大文件(> 1GB)时,它们无法复制。源存储桶是多区域的,目标存储桶是区域和近线的。
我的代码本质上是:
client = storage.Client()
src_bucket = client.get_bucket(src_bucket_name)
src_blob = src_bucket.get_blob(src_filename)
dst_bucket = client.get_bucket(dst_bucket_name)
dst_blob = dst_bucket.blob(dst_filename)
dst_blob.rewrite(src_blob)
Run Code Online (Sandbox Code Playgroud)
最初,云函数在 60 秒时超时,所以我认为这就是问题所在,但后来我将云函数超时设置为 540 秒,但该函数仍然超时。我让该函数重试 20 分钟,因此我可以看到该问题是可重复的。在提高云函数超时失败后,我阅读了 blob 文档,发现 blob.rewrite 也有 60 秒的默认超时,因此我也将其提高到 540 秒,但这仍然超时。
此时,我不确定我错过了什么。这是超时问题吗?或者这与发布/订阅发布多条消息有关,以便我可以有多个云功能尝试同时制作相同的副本?或者是否有更好的方法在存储桶之间自动移动大文件?
首先,了解一下幕后发生的事情:
GCS的重写操作是在线操作。当重写请求确认成功时,重写已经完成,新的操作准备就绪。缺点是用户必须在复制完成时保持打开重写连接。不过,联系不会永远持续下去。如果操作将花费超过 30 秒左右的时间,则重写请求可能会不完整地结束。在这种情况下,它将返回一个重写令牌,客户端必须使用该令牌来恢复请求,否则将不会取得进一步的进展。
在Python中,看起来像这样:
rewrite_token = ''
while rewrite_token is not None:
rewrite_token, bytes_rewritten, bytes_to_rewrite = dst_blob.rewrite(
src_blob, token=rewrite_token)
print(f'Progress so far: {bytes_rewritten}/{bytes_to_rewrite} bytes.')
Run Code Online (Sandbox Code Playgroud)
这对于较小的对象或服务不需要执行任何工作来移动数据的对象来说并不重要。但对于大型操作,您需要检查是否需要恢复。
也就是说,超时并不是我期望从您的代码中看到的情况。这是另一种失败。您确定收到的错误是超时吗?
| 归档时间: |
|
| 查看次数: |
2405 次 |
| 最近记录: |