具有最少实例的 Google Cloud Function:每次部署后冷启动?

Joh*_*ika 3 cold-start firebase google-cloud-platform google-cloud-functions

为了最大限度地减少冷启动,我为 Google Cloud Function 设置了最小实例。我实际上是使用 firebase admin SDK 来实现的,如下所示:

functions.runWith({ minInstances: 1 })
Run Code Online (Sandbox Code Playgroud)

...但我可以在 Google Cloud Console 中看到它得到确认:

在此输入图像描述

我注意到每次部署后,我仍然会遇到一次冷启动。我本以为一个实例已准备好并准备好迎接第一个请求,但情况似乎并非如此。例如,以下是日志:

在此输入图像描述

您可以看到部署后约 16 小时,第一个请求进来。这是一个冷启动,需要 8139 毫秒。下一个请求大约又过了一个小时,但没有冷启动,并且该请求需要 556 毫秒,明显快于第一个请求。

那么这是预期的行为吗?即使设置了最小实例数,我们是否还会遇到冷启动?那么,我是否应该在每次部署后使用虚拟请求启动云功能,以防止我的用户遇到第一次冷启动?

Jef*_*eff 5

Tl;dr:设置了最小实例的函数的第一次执行从技术上来说并不是冷启动,但可能会比该实例的后续执行慢。


函数的最小实例将在部署时立即“预热”并处于温暖但空闲的状态状态,准备响应请求。然而,我们编写的函数在第一次实际触发时通常需要做额外的设置工作。

例如,我们可能使用动态导入来拉入库或需要建立与远程数据库的连接。即使函数实例是热的,第一次执行时必须完成的额外工作意味着它可能会比以后的执行慢。

最小实例设置的好处是,以后的执行可以从第一次执行完成的所有设置工作中受益,并且比它们缩小到零并且必须在下一个请求时重新设置自己要快得多。

更新:有时,空闲实例可能会被 Cloud Functions 后端终止。如果发生这种情况,另一个实例将立即启动以满足所需的最小实例设置,但该新实例在第一次触发时将需要再次执行额外的设置工作。然而,这种情况确实不应该经常发生。

  • 我与 Cloud Functions 工程师交谈并了解到,偶尔,一个空闲实例可能会被 Cloud Functions 后端杀死。如果发生这种情况,另一个实例将立即启动以满足所需的最小实例设置,但该新实例在第一次触发时将需要再次执行额外的设置工作。然而,这种情况确实不应该经常发生。您是否愿意提交支持案例(https://firebase.google.com/support/troubleshooter/report/bugs),以便工程师可以查看您的特定项目/代码并找到问题的根源? (2认同)