配置实例数上限

您可以通过设置 Cloud Functions 函数实例数上限来控制函数的扩缩行为。设置实例数上限可控制费用,并防止下游资源不堪重负。

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

大多数情况下,自动扩缩都是有利的,但在某些情况下,您可能需要限制在任何给定时间可能存在的实例总数。例如,与函数交互的数据库可能只能处理一定数量的打开连接。

Cloud Functions(第 2 代)将并发作为额外的扩缩机制。为并发配置的函数可以在单个实例上同时执行多个请求。您可以将某个函数配置为使用并发和多个实例来优化其性能。如需了解有关配置并发的信息,请参阅 Cloud Functions 并发

设置和清除实例数上限

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

设置实例数上限

您可以使用 Google Cloud CLI 或 Google Cloud 控制台设置实例数上限。如果您未指定限制,Cloud Functions 将设置以下默认值:

  • 3000 [适用于 Cloud Functions(第 1 代)函数]
  • 100 [适用于 Cloud Functions(第 2 代)函数]

如需设置实例数上限,请执行以下操作:

控制台

  1. 转到 Cloud Functions 概览页面

  2. 点击创建函数

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

  4. 展开页面末尾的运行时、构建... 部分,然后点击运行时标签页。

  5. 自动扩缩部分的实例数上限字段中,输入一个值或使用默认值。

gcloud

如需设置实例数上限,请运行带有 --max-instances 标志的 deploy 命令:

gcloud functions deploy FUNCTION_NAME --max-instances MAX_INSTANCE_LIMIT

替换以下内容:

  • FUNCTION_NAME:函数的名称。

  • MAX_INSTANCE_LIMIT:要设置为实例数上限的数字,例如 3000。

清除实例数上限

您可以使用 gcloud 命令行工具或 Google Cloud 控制台清除 Cloud Functions (第 1 代) 函数的实例数上限。Cloud Functions(第 2 代)函数需要定义的实例数上限。

控制台

如需清除 Cloud Functions(第 1 代)函数的实例数上限,请执行以下操作:

  1. 转到 Cloud Functions 概览页面

  2. 点击现有函数以转至其详情页面。您可以在详情标签页中查看函数的当前实例数上限。

  3. 点击修改

  4. 展开页面末尾的运行时、构建... 部分,然后点击运行时标签页。

  5. 自动扩缩部分的实例数上限字段中,输入 0

gcloud

如需清除 Cloud Functions(第 1 代)函数的实例数上限,请运行带有 --clear-max-instances 标志的 deploy 命令:

gcloud functions deploy FUNCTION_NAME --clear-max-instances

限制和最佳做法

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

选择实例上限值

实例数上限设置的最佳值取决于函数特性,包括调用执行时长、其预期平均和峰值调用频率,以及您的应用对调用失败的容忍度。推荐做法是,先将实例数上限值设置为 3,然后监控调用失败情况,并根据需要向上调整实例数上限值。

防范过度扩容

如果没有指定实例数上限,Cloud Functions(第 1 代)会优先选择扩容以满足需求,而不是限制吞吐量。这意味着您的第 1 代函数可能具有的并发实例数实际上是无限的,除非您已配置了这样的限制。Cloud Functions(第 2 代)不支持没有实例数上限的函数

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

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

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

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

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

发送到过载 HTTP 函数的请求会失败,并返回响应代码

  • 429 Too Many Requests(如果配置了实例数上限值);或者
  • 500 Internal Server Error(如果未配置实例数上限值,仅限第 1 代函数)

系统会自动保存发往事件驱动型函数的事件,直至有容量可用。

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

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

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

处理流量高峰

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

部署

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

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

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

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

清除实例数上限

将 Cloud Functions(第 1 代)函数的实例数上限设置为 0 会清除函数的现有实例数上限,但不会暂停函数。