多个文件gcp存储桶事件的云函数

问题描述 投票:0回答:3

我正在 GCP 中创建一个云函数,以自动调整上传到存储桶的图像大小并将其传输到另一个存储桶。由于图像是批量到达的,并且一个文件夹可能包含数百或数千张图像,因此最好在代码中加入处理多个文件的能力,还是让云函数在上传的每张图像上触发更好。

google-cloud-platform google-cloud-functions google-cloud-storage
3个回答
2
投票

对于无服务器产品来说,并行处理确实非常强大,因为它会根据您的工作负载自动扩展和缩减。

如果您可以在几秒钟内收到数千张图像,则无服务器产品的可扩展性可能会遇到困难,并且您可能会丢失一些消息(无服务器扩展速度很快,但这并不神奇!!)

更好的解决方案是在 PubSub 中发布 Cloud Storage 事件。这样您就可以轻松地重试失败的消息。

如果你继续增加镜像数量,或者想优化成本,我建议你看看Cloud Run。

您可以将 PubSub 推送订阅插入 Cloud Run。 Cloud Run 的强大之处在于能够在同一实例上处理多个 HTTP 请求(PubSub 推送消息 -> Cloud Storage 事件),从而能够在同一实例上同时处理多个图像。如果转换过程属于计算密集型,则 Cloud Run 实例上最多可以有 4 个 CPU。

并且,作为云功能,您只需支付活动(正在处理请求)实例的数量。使用 Cloud Functions,您一次可以处理 1 个请求,因此每个文件有 1 个实例。使用 Cloud Run,您可以处理多达 1000 个并发请求,因此您可以减少多达 1000 倍的实例数量,从而降低成本。但是,请注意处理所需的 CPU,如果是计算密集型,则无法同时处理 1000 张图像。


0
投票

当存储桶中创建新对象(或覆盖现有对象,并创建该对象的新一代)时,会发送

finalize
事件。

每上传一个对象就会触发一个新函数。您可以尝试将所有这些图像压缩在客户端上的

ZIP
文件中,上传它,这样它只会触发 1 个功能,然后在解压缩后将图像上传回存储。但请确保您没有达到文档中提到的任何限制。


0
投票

我知道这是不久前的帖子,但如果其他人正在处理类似的事情,我会回答。我也遇到了这个问题 - 当我注销事件负载时,我意识到这是由于一些临时文件写入 GCS 导致了多次调用。这些临时文件在GCS存储桶中甚至不可见,但它们仍然触发了云功能。解决方案:您可以将代码逻辑包装在 IF 语句中,例如:

if "SomeFileName" in event[“name”]:

此博客有更多信息https://medium.com/@jenn_wang/event-driven-cloud-function-triggered-multiple-times-how-to-address-it-ed8dc58a14c6

© www.soinside.com 2019 - 2024. All rights reserved.