【发布时间】:2020-04-15 01:49:35
【问题描述】:
我正在使用 Cloud Run 创建数据提取管道。每次通过 Pub Sub 将文件放入 GCS 存储桶时,都会调用我的 Cloud Run api。我需要加载一些元数据,其中包含我正在摄取的数据的文本。此元数据很少更改。我显然不想在每次执行时将它重新加载到内存中。我最好的选择是什么?到目前为止,我能够研究的是:
选项一
如果对象的开销很大,您也可以在内存中缓存它们 在每个服务请求上重新创建。从请求逻辑中移动它 到全局范围会导致更好的性能。 https://cloud.google.com/run/docs/tips#run_tips_global_scope-java
在这个链接给出的例子中,heavyComputation 函数是否只在冷启动时被调用一次?如果我需要在元数据更新时偶尔重新触发此功能怎么办。我还发现以下信息令人不安,因为似乎无法保证其他实例会重用该对象。
在 Cloud Run 中,您不能假设保留了服务状态 请求之间。但是,Cloud Run 确实重用了单个容器 实例来服务持续的流量,因此您可以在 全局范围以允许其值在后续使用 调用。任何个人请求是否受益于 这种重用无法提前知道。
选项 2
使用 Redis 或 Cloud Memory Store 之类的东西,只要有变化,就会由云功能更新。并且所有的云运行 api 实例都从 Redis 中拉取元数据信息。这会比选项 1 性能更低还是更高?这还有其他不利方面吗?
如果有其他更好的方法可以做到这一点,我会很感兴趣。
更新 1:我想了更多,因为我的元数据对于每个租户都会有所不同,而且我的云运行代码的每次调用都会为一个租户摄取一个文件,因此将是一个坏主意在每次执行时加载所有租户元数据,即使它被缓存。不过,我可能会在每个租户的项目中运行单独的云运行。
【问题讨论】:
标签: shared-memory google-cloud-run data-ingestion google-cloud-memorystore