如何保持Google Cloud Functions的温暖?

har*_*nlo 10 firebase-hosting google-cloud-functions next.js serverless

我知道这首先错过了使用Cloud Functions的意义,但是在我的特定情况下,我正在使用Cloud Functions,因为这是将Next.js与Firebase Hosting桥接的唯一方法。我不需要使其具有成本效益,等等。

话虽如此,Cloud Functions的冷启动时间简直难以忍受,而且还不能投入生产,对于我的样板,平均大约需要10到15秒。

我当然已经看过Google的这段视频(https://www.youtube.com/watch?v=IOXrwFqR6kY),其中谈到了如何减少冷启动时间。简而言之:1)修剪依赖关系; 2)依赖关系版本在Google网络缓存中的尝试和错误; 3)延迟加载。

但是,嘿,1)我可以裁剪的依赖项太多了。2)真是无用的建议!我怎么知道哪个版本的缓存更多?3)只有太多依赖项可以延迟加载。

另一种方法是一起避免冷启动。从本质上讲,我可以使(一个或唯一一个)云功能保持温暖是什么好方法?

Dou*_*son 12

对于所有“无服务器”计算提供商,总会有某种形式的冷启动成本无法消除。即使您能够通过ping通使单个实例保持活动状态,系统也可以启动任意数量的其他实例来处理当前负载。这些新实例将产生冷启动成本。然后,当负载减少时,不必要的实例将被关闭。

正如您所发现的,有很多方法可以使您的冷启动成本降至最低,但是无法消除这些成本。

如果您绝对要求热服务器处理24/7的请求,则需要管理自己的运行24/7的服务器(并支付运行24/7的服务器的费用)。如您所见,无服务器的好处在于您无需管理或扩展自己的服务器,而只为使用的服务器付费,但是与项目相关的冷启动成本却不可预测。这就是权衡。

  • 我愿意花钱购买一个低洼的实例设置,以便云功能始终处于低纬度。在开发和演示新功能时,这始终是一个问题。此外,某些功能没有被太多使用,导致应用程序在这些区域看起来很慢。 (8认同)

Daz*_*kin 5

你不是第一个问的人 ;-)

答案是配置远程服务以定期调用您的函数,以便单个|唯一实例保持活动状态。

从您的问题中不清楚,但我假设您的 Function 提供了一个 HTTP 端点。在这种情况下,找到可以配置为每 x 秒|分钟进行一次 HTTP 调用的运行状况检查或 cron 服务,并将其指向您的函数。

您可能需要调整时间才能找到金发姑娘时期——不要太频繁以至于你在浪费精力,也不要太频繁以至于它死掉——但这就是其他人所做的。

  • 在低 (ping) 卷时,服务不太可能尝试使用其他实例进行扩展。您的问题表明您对替代解决方案不感兴趣,以及是否有办法让实例保持活动状态。这是目前该问题的唯一解决方案。 (3认同)
  • 谢谢回答!我认为 Doug(另一个回答者)有一个观点,我引用:“即使你能够通过 ping 一个实例来保持它的存活,系统也可能启动任意数量的其他实例来处理当前负载。那些新的实例将具有冷启动成本。” 所以ping它不会使它成为一个好的解决方案。而且我实际试过,冷启动还是随机的... (2认同)

Joh*_*ika 5

您现在可以指定MIN_INSTANCE_LIMIT让实例始终运行。

云函数文档:https ://cloud.google.com/functions/docs/configuring/min-instances

文档中的云函数示例:

gcloud beta functions deploy myFunction --min-instances 5
Run Code Online (Sandbox Code Playgroud)

它也可以通过指定在 Firebase Functions 中使用minInstances

Firebase 函数文档:https://firebase.google.com/docs/functions/manage-functions#min-max-instances

弗兰克在 Twitter 上宣布:https://twitter.com/puf/status/1433431768963633152

文档中的 Firebase 函数示例:

exports.getAutocompleteResponse = functions
    .runWith({
      // Keep 5 instances warm for this latency-critical function
      minInstances: 5,
    })
    .https.onCall((data, context) => {
      // Autocomplete a user's search term
    });
Run Code Online (Sandbox Code Playgroud)