Google 具有最少实例的云功能:每次部署后冷启动?

Google Cloud Function with minimum instances: cold start after every deployment?

为了尽量减少冷启动,我为我的 Google 云函数设置了一个最小实例。我实际上是这样用 firebase admin SDK 做的:

functions.runWith({ minInstances: 1 })

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

我注意到每次部署后,我仍然会遇到一次冷启动。我会假设一个实例会准备好并为第一个请求做好准备,但事实似乎并非如此。例如,这里是日志:

你可以看到部署后约 16 小时,第一个请求进来了。冷启动需要 8139 毫秒。下一个请求在大约一个小时后到达,但没有冷启动,请求耗时 556 毫秒,比第一个请求快得多。

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

documentation 没有对行为做出硬性保证(强调我的):

To minimize the impact of cold starts, Cloud Functions attempts to keep function instances idle for an unspecified amount of time after handling a request.

因此,有一次尝试(不保证),它会在处理请求后(而不是部署后)开始,但您不知道会持续多长时间。如前所述,听起来您可能想要提出一个请求,并期望它可能仍然不总是按照您想要的方式工作。

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


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

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

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

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