Google cloud platform 如何让谷歌云功能保持温暖?

Google cloud platform 如何让谷歌云功能保持温暖?,google-cloud-platform,google-cloud-functions,next.js,serverless,firebase-hosting,Google Cloud Platform,Google Cloud Functions,Next.js,Serverless,Firebase Hosting,我知道这一点在一开始就忽略了使用云函数的意义,但在我的具体案例中,我使用云函数是因为这是我将Next.js与Firebase主机连接起来的唯一方法。我不需要使它具有成本效益等等 话虽如此,云功能的冷启动时间简直无法忍受,而且还没有准备好生产,对于我的样板来说,平均约为10到15秒 我当然看过Google()的这段视频,它讲述了如何缩短冷启动时间。简言之:1)修剪依赖项,2)谷歌网络缓存依赖项版本的试错,3)延迟加载 但是,嘿,1)我可以修剪的依赖项太多了。2) 我如何知道哪个版本更容易缓存?3)

我知道这一点在一开始就忽略了使用云函数的意义,但在我的具体案例中,我使用云函数是因为这是我将Next.js与Firebase主机连接起来的唯一方法。我不需要使它具有成本效益等等

话虽如此,云功能的冷启动时间简直无法忍受,而且还没有准备好生产,对于我的样板来说,平均约为10到15秒

我当然看过Google()的这段视频,它讲述了如何缩短冷启动时间。简言之:1)修剪依赖项,2)谷歌网络缓存依赖项版本的试错,3)延迟加载

但是,嘿,1)我可以修剪的依赖项太多了。2) 我如何知道哪个版本更容易缓存?3) 我只能延迟加载这么多依赖项


另一种方法是避免冷启动。有什么好方法或技巧可以让我的(唯一的)云功能保持温暖?

你不是第一个问的;-)

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

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

你可能需要调整时间来找到金凤花期——不是经常浪费精力,也不是经常死亡——但这是其他人所做的。

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

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


如果您绝对需要热服务器24/7处理请求,那么您需要管理自己的24/7运行服务器(并支付这些服务器24/7运行的成本)。如您所见,无服务器的好处在于您不管理或扩展自己的服务器,您只需为使用的服务器付费,但您的项目会产生不可预测的冷启动成本。这是一个折衷办法。

您可以通过cron作业触发它,如下所述:

使用Google Scheduler是一个明智的解决方案,但实际实现并不那么简单。请查看详细信息。功能示例:

myHttpFunction: functions.https.onRequest((request, response) => {
  // Check if available warmup parameter.                                   
  // Use  request.query.warmup parameter if warmup request is GET.                                   
  // Use request.body.warmup parameter if warmup request is POST.                                   
  if (request.query.warmup || request.body.warmup) {
    return response.status(200).type('application/json').send({status: "success", message: "OK"});
  }
});
myOnCallFunction: functions.https.onCall((data, context) => {
  // Check if available warmup parameter.
  if (data.warmup) {
    return {"success": true};
  }
});
gcloud cli命令示例:

gcloud --project="my-awesome-project" scheduler jobs create http  warmupMyOnCallFuntion --time-zone "America/Los_Angeles" --schedule="*/5 5-23 * * *" --uri="https://us-central1-my-awesome-project.cloudfunctions.net/myOnCallFuntion" --description="my warmup job" --headers="Content-Type=application/json" --http-method="POST" --message-body="{\"data\":{\"warmup\":\"true\"}}"

gcloud --project="my-awesome-project" scheduler jobs create http  warmupMyHttpFuntion --time-zone "America/Los_Angeles" --schedule="*/5 5-23 * * *" --uri="https://us-central1-my-awesome-project.cloudfunctions.net/myHttpFuntion?warmup=true" --description="my warmup job" --headers="Content-Type=application/json" --http-method="GET"

为了将冷启动降至最低,没有单一的解决方案,而是多种技术的混合。问题更多的是如何使我们的lambda速度如此之快,我们不太关心冷启动-我所说的启动时间范围是100-500 ms

如何让你的lambda跑得更快?

  • 将包大小保持在尽可能小的范围内(删除所有使用了其中一小部分的大型库)-将包大小保持在最大20 MB。每次冷启动时,都会获取并解压缩此包
  • 尝试在应用程序开始时初始化您想要的部分。 Nodejs-
  • 如果您为您的服务使用JVM技术,请尝试将它们迁移到Graalvm,在Graalvm中,启动开销将降至最低。
    • micronaut+graalvm
    • quarkus+graalvm
    • helidon+graalvm
  • 使用云基础设施配置减少冷启动
  • 2020年的冷启动并不像几年前那么痛苦。我想说更多关于AWS的内容,但我相信所有这些都适用于任何云提供商


    2019年底,AWS引入了Lambda并发资源调配-https://aws.amazon.com/about-aws/whats-new/2019/12/aws-lambda-announces-provisioned-concurrency/,你不必再那么关心气候变暖了。

    谢谢你的回答!我认为Doug(另一位回答者)有一个观点,我引述他的话:“即使你能够通过ping使一个实例保持活动状态,系统可能会启动任意数量的其他实例来处理当前负载。这些新实例将有一个冷启动成本。”因此ping它并不是一个好的解决方案。我试过了,实际上,冷启动仍然是随机的……在低(ping)容量下,服务不太可能尝试使用其他实例进行扩展。您的问题指定您对替代解决方案不感兴趣,以及是否有保持实例活动的方法。这是目前该问题的唯一解决方案。我只需要付费安装一个低洼的实例,以便云功能始终处于低洼状态。在开发和演示新功能时,这始终是一个问题。此外,一些功能没有使用太多,导致应用程序在这些方面看起来很慢。