控制扩缩行为

借助 Cloud Functions 中的实例数上限功能,您可以限制函数为了响应传入请求而扩容的程度。

Cloud Functions 通过创建新函数实例来实现扩容。每个此类实例一次只能处理一个请求,因此,请求数量达到高峰可能会导致系统创建许多实例。

通常情况下,这是人们所期望的。但在某些时候,您可能需要限制在任何给定时间可以共存的实例总数。例如,您的函数可能会与只能处理一定数量的并发打开连接的数据库交互。

使用实例数上限

您可以在部署期间为单个函数设置实例数上限。每个函数可以有各自的实例数上限。各个函数彼此独立地进行扩缩。

设置实例数上限

如需使用 gcloud 命令行工具设置实例数上限,请在部署时使用 --max-instances 标志:

gcloud functions deploy FUNCTION_NAME --max-instances 10 FLAGS...

在上述示例中,FLAGS... 是指在部署函数期间传递的其他选项。如需查看 deploy 命令的完整参考信息,请参阅 gcloud functions deploy

您还可以在通过 Cloud Console 创建函数期间设置实例数上限。为此,请执行以下操作:

  1. 转到 Cloud Functions 概览页面

  2. 点击创建函数

  3. 填写函数的必填字段。

  4. 点击更多以展开高级设置。

  5. 函数实例数量上限部分,输入所需值。

清除实例数上限

如果需要清除针对函数设定的上限,您可以在部署时使用 --clear-max-instances 标志:

gcloud functions deploy FUNCTION_NAME --clear-max-instances

您还可以在 Cloud Console 中清除实例数上限:

  1. 转到 Cloud Functions 概览页面

  2. 点击现有函数以转至其详情页面。

  3. 点击修改

  4. 点击更多以展开高级设置。

  5. 函数实例数量上限部分,输入“0”或将该字段留空。

限制和最佳做法

本部分提供了有关使用实例数上限的指南。

防范过多扩容

如果没有指定 --max-instances 限制,则 Cloud Functions 旨在支持扩容以满足需求,而不是限制吞吐量。这意味着您的函数可能具有的并发实例数实际上是无限的,除非您已配置了这样的限制。

我们建议为任何将请求发送到吞吐量受限或不可伸缩的下游服务的函数分配一项 --max-instances 限制。此类限制可提高整体系统稳定性,并有助于防范异常高的请求级别。

当所有实例都在使用时的请求处理

正常情况下,函数创建新实例进行纵向扩容,以处理传入的流量负载。但是,如果您设置了实例数上限,则可能会遇到没有足够的实例来满足传入流量负载需求的情况。

在这种情况下,Cloud Functions 函数将尝试在长达 30 秒的时间内处理新的入站请求:

  • 如果某个实例在此时间段内处理完其请求,则可能会开始处理这个新的入站请求。
  • 如果没有可用的实例,则该请求将失败。

超出 Cloud Functions 函数扩缩能力的实例数上限

在指定实例数上限时,您实际指定的是一个数量上限。设置较高的上限并不意味着您的函数将纵向扩容到指定的实例数量,它只意味着在任何时间点共存的实例数量不得超过此上限。

此外,设置实例数上限可能会影响 Cloud Functions 函数用于满足流量需求的扩缩策略。通常,Cloud Functions 函数会优先遵循您指定的上限,而不是纵向扩容(甚至超过您的上限)。

处理流量高峰

在某些情况下,例如流量快速激增时,Cloud Functions 函数在短时间内创建的实例数量可能多于指定的实例数上限。如果您的函数无法承受此暂时性行为,您可能需要考虑安全边际因素,设置一个低于函数承受能力的实例数上限。

部署

部署新版函数时,Cloud Functions 会将流量从旧版本迁移到新版本。因为实例数上限是针对每个函数版本独立设置的,所以部署后的一段时间内,实际的实例数可能会暂时超出指定的上限。

例如,某个函数的实例数上限可能是 5 个。正常情况下,该函数在处理请求时会纵向扩容到 5 个实例。部署新版函数后,新版本自身的实例数上限是 5 个。

部署新版函数后,该函数的上一版本已处理的请求不会中断。这些请求将继续得到处理。新的入站请求将由新部署的函数版本处理。

因此,在部署新版本后的一段时间内,此函数最多可能有 10 个实例(每个函数版本各有 5 个实例)。上一版函数的实例终止运行所需的时间取决于这些实例处理完所有活跃请求所需的时间。这是在选择适当的实例数上限时需要考虑的一个额外因素。

空闲实例和最大限度地减少冷启动

为最大限度地降低冷启动产生的影响,Cloud Functions 通常会保留为您的函数预留的空闲实例。如果突然遇到流量高峰,这些实例可以立即处理请求。

例如,某个实例处理完请求后,可能会在一段时间内保持空闲状态,以应对可能需要处理入站请求的情况。为了应对需要处理其他请求的情况,空闲实例可能会保留资源,例如打开的数据库连接。这些空闲实例会计入给定函数版本的实例数上限。您无需为这些空闲实例付费。

清除实例数上限

将实例数上限设置为“0”会导致现有的实例数上限被清除。 设置“0”值不会暂停函数。