在Cloud Run中将共享的缓存对象存储在哪里?

我正在使用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:我考虑了更多,因为每个租户的元数据都将有所不同,并且每次对云运行代码的调用都将为一个租户摄取一个文件,所以这样做不是一个好主意。每次执行时都加载所有租户元数据,即使已将其缓存。我可能会在每个租户的项目中运行单独的云。

owenlixuan 回答:在Cloud Run中将共享的缓存对象存储在哪里?

我们从您的初始前提开始,即“我显然不想在每次执行时将其重新加载到内存中”。对我而言,这并非总是正确的说法。如果我实现了缓存技术,那么作为一名程序员,我已经花了很多时间将其正确设置,并引入了错误和维护机会。如果我每次执行节省了100毫秒,那么在这些成本与增加执行时间所节省的成本之间,要实现成千上万次执行盈亏平衡呢?我通常会先采用最简单的方法,并准备在将来监视操作并仅在有必要时提出改进建议。

总而言之,让我们假设您已经确定每秒将要发出不计其数的新文件创建请求并想要进行优化。理解如何最佳使用Cloud Run的关键是它运行可以处理并发请求的整个容器。我相信默认值为80。这意味着,如果创建了80个并发文件,则将仅创建一个容器实例,并且将处理80个并行事件。如果您使用Java进行编码,则意味着80个并发线程都在同一JVM中。每个线程将具有对通用全局变量的并发寻址能力。仅当第81个请求到达并且之前的80个请求都没有完成时,才会产生一个新的Cloud Run容器。

这说明我的第一个“改进”是在首次使用时在JVM中填充高速缓存数据,并保留它们以供以后重用。什么时候填充缓存数据?这将是您的设计选择。您可以在容器首次启动时将其全部填充到前面……如果您知道每个请求都会使用该数据,这将是明智的。另外,如果您有多个可缓存的值,请考虑创建一个包含名称/值对并具有访问器的映射,该访问器返回一个缓存的值(如果存在)或从慢速存储,缓存中检索并返回一个值(如果最初不存在) )。

,

关于第一个选项(选项1 ):

heavyComputation()函数here仅在冷启动时每次创建新的Cloud Run container instance时才会调用(当可并行发送给定请求的最大请求数时)超出了容器实例,因此创建了一个新的实例。

为了解决第二个选项(选项2 ):

到目前为止,Cloud Run(完全托管)不支持无服务器VPC访问,因此不可能连接到Cloud Memorystore。监视以下Feature Request,以从Cloud Run产品团队获取所有相关信息和更新,以检查何时可以使用此功能。

您可以在此post和前面提到的功能请求中找到一些解决方法。它们基本上包括:

  1. Using a Google Kubernetes Engine cluster with Cloud Run
  2. 在Compute Engine上设置Redis实例。
本文链接:https://www.f2er.com/2870449.html

大家都在问