我正在使用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之类的东西。所有云实例都从Redis运行api提取元数据信息。这会比选择1的性能差多少?还有其他不利之处吗?
如果还有其他更好的方法,我将非常感兴趣。
更新1:我考虑了很多,因为每个租户的元数据都将有所不同,并且每次对云运行代码的调用都将为一个租户摄取一个文件,所以加载所有租户是一个坏主意每次执行时即使已缓存元数据,也是如此。我可能会在每个租户的项目中运行单独的云。
关于第一个选项(选项1):
该heavyComputation()
功能在这里将只在冷启动时被调用,每一个新的时间云中运行的容器实例被创建时(超过可并行发送到指定容器实例的请求的最大数量,因此新instnace创建)。
为了解决第二个选项(选项2):
到目前为止,Cloud Run(完全托管)不支持无服务器VPC访问,因此不可能连接到Cloud Memorystore。监视以下功能请求,以从Cloud Run产品团队获取所有相关信息和更新,以检查该功能何时可用。
你可以找到一些这方面的解决方法后和已经提到的功能要求。它们基本上包括:
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句