AIK*_* DO 5 shared-memory data-ingestion google-cloud-memorystore google-cloud-run
我正在使用 Cloud Run 创建数据提取管道。每次通过 Pub Sub 将文件放入 GCS 存储桶时,我的 Cloud Run api 都会被调用。我需要加载一些元数据,其中包含我正在摄取的数据的文本。此元数据很少更改。我显然不想在每次执行时将其重新加载到内存中。我最好的选择是什么?到目前为止我能够研究的是:
选项1
如果在每个服务请求上重新创建对象的成本很高,您还可以将对象缓存在内存中。将其从请求逻辑转移到全局范围会带来更好的性能。 https://cloud.google.com/run/docs/tips#run_tips_global_scope-java
在此链接给出的示例中,heavyComputation 函数仅在冷启动时调用一次吗?如果我需要在元数据更新时偶尔重新触发此功能怎么办?我还发现以下信息令人不安,因为它似乎说不能保证其他实例会重用该对象。
在 Cloud Run 中,您不能假设服务状态在请求之间保留。但是,Cloud Run 确实会重用各个容器实例来服务持续的流量,因此您可以在全局范围内声明一个变量,以允许在后续调用中重用其值。无法提前知道是否有任何单独的请求能够从这种重用中获益。
选项2
使用 Redis 或云内存存储之类的东西,只要有变化,云功能就会更新。所有云运行 api 的实例都从 Redis 中提取元数据信息。这会比选项 1 的性能更低还是更高吗?这还有其他缺点吗?
如果还有其他更好的方法可以做到这一点,我会很感兴趣。
更新 1:我更多地考虑了这一点,由于每个租户的元数据都会有所不同,并且每次调用云运行代码都会为一个租户摄取一个文件,因此加载所有租户是一个坏主意每次执行时的元数据,即使已缓存。不过,我可能会在每个租户的项目中运行单独的云。
关于第一个选项(选项1):
此处的heavyComputation()函数仅在冷启动时调用,每次新的Cloud Run 容器实例时超出可以并行发送到给定容器实例的最大请求数并因此创建新实例时)。
为了解决第二个选项(选项2):
截至目前,Cloud Run(完全托管)不支持无服务器 VPC 访问,因此无法连接到 Cloud Memorystore。监控以下功能请求,从 Cloud Run 产品团队获取所有相关信息和更新,以检查此功能何时可用。
您可以在这篇文章和已经提到的功能请求中找到一些解决方法。它们基本上包括: