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