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