函数计算为您提供了按量模式和预留模式两种实例使用模式。本文介绍两种实例使用模式的功能原理、计费方式、使用场景、实例伸缩限制以及如何在函数计算控制台配置预留模式实例和配置预留模式的弹性伸缩。

按量模式

按量模式是指函数实例的分配和释放完全由函数计算系统负责。函数计算会根据函数的调用量自动进行实例扩缩容,在调用增加时创建实例,在请求减少后销毁实例。整个过程完全自动,提高了资源利用率,同时极大地降低了您管理资源的难度。您的阿里云账号(主账号)在单个地域内默认的按量实例上限数为300。如果您需要提高该限制,提交工单申请。

计费方式:只有发生函数调用时才会产生费用,无函数调用请求就不会分配实例也不会产生费用。关于具体产品定价和计费,请参见计费概述

预留模式

由于按量模式是通过请求自动触发实例的创建,当首次发起调用时需要等待实例冷启动,如果您希望消除冷启动延时的影响,可以通过配置预留模式来解决。预留模式是将函数实例的分配和释放交由您管理,当配置预留函数实例后,预留的函数实例将会常驻,直到您主动将其释放。函数计算会优先将函数调用请求调度至预留的函数实例,当函数请求的并发超过预留的函数实例处理能力时,超出部分的请求将会转发给按量模式的实例。

计费方式:预留模式的实例的计费从实例成功创建后开始,一直到您主动将其释放为止。由于预留实例是由您自己负责申请和释放,所以即使预留的函数实例未执行任何请求,只要没有释放函数实例,您都需要为预留的函数实例付费。关于具体产品定价和计费,请参见计费概述On-Demand Resources

闲置计费(Beta)

默认情况下,闲置计费功能处于关闭状态,此时预留模式的实例无论是否正在处理请求,都会始终为其分配CPU,让实例始终处于活跃状态,以保证实例可以在无请求时正常运行后台任务。开启闲置计费功能后,当预留的实例无请求时,函数计算会将实例的CPU冻结,使该实例进入闲置状态,并以闲置实例资源单价计算使用成本。闲置实例资源使用单价是活跃实例资源使用单价的20%,这将帮助您节省大量的成本。更多信息,请参见计费概述

使用场景

您可以根据不同的使用场景选择是否启用闲置计费功能。

  • 使用成本

    如果您需要预留模式来消除冷启动,又担心预留成本过高,建议启用闲置计费功能。此时,您只需为闲置状态的预留实例支付较少的费用,就能实现无冷启动的响应调用需求。

  • 后台任务
    如果您的函数需要运行后台任务,建议关闭闲置计费功能。例如:
    • 使用依赖于内置调度或后台功能的应用框架,或依赖的中间件需要定期汇报心跳。
    • 使用Go语言的Goroutin轻量级线程、Node.js语言的async函数或Java语言的异步线程执行异步操作。

实例伸缩限制

配置按量模式实例的伸缩限制

在处理函数调用请求时,函数计算会优先使用已有的可用实例,若当前实例已经满载,函数计算会创建新的实例来处理请求。随着调用请求量的增加,函数计算会持续创建新的实例,直到有足够的实例处理请求或者达到您设置的实例数上限。在实例扩容的过程中,将受到以下限制:
  • 处于执行状态的实例总数,默认限制为每个地域300个。
  • 处于执行状态的实例数的扩容速度,受突增实例数和实例增长速度的限制。不同地域的限制条件,请参见各地域扩容速度限制
    • 突增实例数:可立即创建的实例数,默认限制为100~300个。
    • 实例增长速度:超过突增实例数后每分钟可增加的实例数,默认限制为100~300个。
当实例总数或者实例扩容速度超过限制后,函数计算将返回流控错误(HTTP Status429)。下图展示了在一个调用量快速增长的场景下函数计算的流控行为:dg_fc_throttling_behaviors
  • 在达到突增实例数前,函数计算立即创建实例,这个过程中有冷启动,但没有流控错误(图示中①)。
  • 达到突增实例数后,实例数的增长受速度限制,部分请求会收到流控错误(图示中②)。
  • 实例数超过限制后,部分请求收到流控错误(图示中③)。

默认情况下,一个阿里云账号在同一个地域下的所有函数共享上述伸缩限制。当需要限制某个函数的实例数时,您可以配置函数级按量实例伸缩控制。配置后,当此函数处于执行状态的函数实例总数超过限制后,函数计算将返回流控错误。

配置预留模式实例的伸缩限制

当突发的调用量较大时,大量的实例创建会受到流控限制导致请求失败,实例的冷启动也会增加请求延时。为避免这些问题,您可以使用函数计算的预留实例,即提前准备好函数实例。预留实例的实例数上限和扩容速度有单独的限制,不受上述实例伸缩限制的影响。
  • 预留实例总数:默认每个地域300个。
  • 预留实例扩容速度:默认每分钟100~300个实例(不同地域的限制不同)。下图展示了和上面相同的负载场景下,使用了预留实例后函数计算的流控行为:dg_fc_ throttling_behaviors_with_provisioned_instances
    • 在预留实例被用满之前,请求立即被执行,这个过程既没有冷启动,也没有流控错误(图示中①)。
    • 在预留实例被用满后,按量实例达到突增实例数之前,函数计算立即创建实例,这个过程中有冷启动,但没有流控错误(图示中②)。

各地域扩容速度限制

地域 实例扩容速度限制-突增实例数 实例扩容速度限制-实例增长速度
华东1(杭州)、华东2(上海)、华北2(北京)、华北3(张家口)、华南1(深圳) 300 300/分钟
其他 100 100/分钟
说明
  • 相同地域下,预留模式和按量模式的扩容速度限制一致。
  • 如果您对弹性速度有更高的需求,提交工单申请。
  • 性能实例和GPU实例的扩容速度小于弹性实例,建议配合预留模式使用。

配置预留实例

  1. 登录函数计算控制台
  2. 在左侧导航栏,单击服务及函数
  3. 在顶部菜单栏,选择地域。
  4. 服务列表页面,单击目标服务操作列的函数管理
  5. 函数管理页面,单击目标函数名称。
  6. 函数详情页面,选择弹性管理页签,然后单击创建规则
  7. 在创建弹性伸缩限制规则页面,配置相关参数,然后单击创建
    reserved-mode-instances
    参数 说明
    基础配置
    版本或别名 在列表中选择需要创建预留模式实例的版本或别名。
    说明 仅支持在LATEST版本创建预留模式实例,其他版本暂不支持。
    函数名称 在列表中选择需要在预留模式的实例上执行的目标函数。
    最小实例数 在文本框中填写预留模式的实例的个数。最小实例数=预留实例个数。
    说明 通过限制函数级别最小实例数来快速响应函数调用请求,降低冷启动的发生次数,为时延敏感的在线业务提供更好的服务响应。
    最大实例数 在文本框中填写最大实例数。最大实例数=预留实例个数+按量实例的最大个数。
    说明
    • 通过限制函数级别最大实例数来防止单个函数过度调用导致的实例占用,保护后端资源,避免预期外的费用开销。
    • 如果此参数留空,最大实例数限制将遵循您的账号和目前所在地域的最大实例数限制。
    闲置计费(Beta) 选择启用或关闭闲置计费功能,默认关闭。参数说明如下:
    • 启用该功能后,仅在处理请求期间为预留模式的实例分配CPU,其余时间实例的CPU将被冻结。
    • 关闭该功能后,预留模式的实例无论是否正在处理请求都会分配CPU。
    (可选)定时修改限制:通过设置定时伸缩您可以更加灵活地配置预留的函数实例,在指定时间将预留的函数实例量设定成需要的值,使函数实例量更好地贴合业务的并发量。
    策略名称 在文本框中填写自定义的策略名称。
    最小实例数 在文本框中按需设置预留数量。
    定时表达式(UTC) 定时信息,本文示例为cron(0 0 20 * * *)。详细信息,请参见参数说明
    生效时间(UTC) 在文本框中设置定时弹性伸缩的开始生效及结束生效时间。
    (可选)根据指标修改限制:根据函数实例并发利用率的情况每分钟对预留资源进行一次伸缩。
    策略名称 在文本框中填写自定义的策略名称。
    最小实例数范围 在文本框中按需设置最小实例数的最小值和最大值。
    利用率阈值 设置伸缩范围,当利用率低于此参数时则进行缩容,当利用率高于此参数时,则进行扩容。
    生效时间(UTC) 在文本框中设置指标弹性伸缩的开始生效及结束生效时间。
    创建完成后,在规则列表,您可以看到目标函数下配置的预留模式的实例情况。

更新预留实例

  1. 登录函数计算控制台
  2. 在左侧导航栏,单击服务及函数
  3. 在顶部菜单栏,选择地域。
  4. 服务列表页面,单击目标服务操作列的函数管理
  5. 函数管理页面,单击目标函数名称。
  6. 函数详情页面,选择弹性管理页签,找到目标规则,然后在其操作列单击编辑
    说明 如果需要删除预留模式的实例,您只需将最小实例数设置为0即可。
  7. 在编辑服务中的限制规则页面,修改基础配置和策略信息,然后单击保存

配置预留模式的弹性伸缩

由于预留模式配置的固定预留值会导致预留函数实例利用不充分,您可以通过定时弹性伸缩和指标追踪弹性伸缩两种模式解决该问题。

定时弹性伸缩

  • 定义:通过定时弹性伸缩您可以更加灵活地配置预留的函数实例,在指定时间将预留的函数实例量设定成需要的值,使函数实例量更好地贴合业务的并发量。
  • 适用场景:如果您的函数有明显的周期性规律或可预知的流量高峰,可以使用定时预留功能来提前预留函数实例。当函数调用并发大于定时预留值时,超出的部分会分配至按量模式的函数实例。
  • 配置示例:如下图配置了两个定时操作,在函数调用流量到来前,通过第一个定时配置将预留函数实例扩容至较大的值,当流量减小后,通过第二个定时配置将预留函数实例缩容到较小的值。instance
参数示例:
  • 为service_1的function_1函数配置定时伸缩,配置的生效区间为:2020-11-01 10:00:00至2020-11-30 10:00:00,在每天20:00将预留函数实例扩容至50,在每天22:00再将预留函数实例收缩至10。
  • {
      "ServiceName": "service_1",
      "FunctionName": "function_1",
      "Qualifier": "alias_1",
      "ScheduledActions": [
        {
          "Name": "action_1",
          "StartTime": "2020-11-01T10:00:00Z",
          "EndTime": "2020-11-30T10:00:00Z",
          "TargetValue": 50,
          "ScheduleExpression": "cron(0 0 20 * * *)"
        },
        {
          "Name": "action_2",
          "StartTime": "2020-11-01T10:00:00Z",
          "EndTime": "2020-11-30T10:00:00Z",
          "TargetValue": 10,
          "ScheduleExpression": "cron(0 0 22 * * *)"
        }
      ]
    }
  • 参数说明如下:
    参数 说明
    Name 配置的定时任务名称。
    StartTime 配置开始生效的时间,UTC格式。
    EndTime 配置结束生效的时间,UTC格式。
    TargetValue 目标值。
    ScheduleExpression 定时信息,支持两种格式:
    • At expressions - "at(yyyy-mm-ddThh:mm:ss)":只调度一次,使用UTC格式。如:北京时间04月01日20:00开始调度,转换为UTC时间就是04月01日12:00开始调度,则可以使用at(2021-04-01T12:00:00)
    • Cron expressions - "cron(0 0 4 * * *)":调度多次,使用标准crontab格式,默认以UTC时间运行,即北京时间减去8个小时。如:北京时间每天20:00点进行调度,转化为UTC时间就是每天12:00进行调度,则可以使用cron(0 0 12 * * *)
    Cron表达式(Seconds Minutes Hours Day-of-month Month Day-of-week)的字段说明如下:
    表 1. 字段说明
    字段名 取值范围 允许的特殊字符
    Seconds 0~59
    Minutes 0~59 , - * /
    Hours 0~23 , - * /
    Day-of-month 1~31 , - * ?/
    Month 1~12或JAN~DEC , - * /
    Day-of-week 1~7或MON~SUN , - * ?
    表 2. 特殊字符说明
    字符名 定义 示例
    * 表示任一,每一。 Minutes字段中:0表示每分钟的0秒都执行。
    , 表示列表值。 Day-of-week字段中:MON,WED,FRI表示星期一,星期三和星期五。
    - 表示一个范围。 Hours字段中:10-12表示UTC时间从10点到12点。
    ? 表示不确定的值。 与其他指定值一起使用。例如,如果指定了一个特定的日期,但您不在乎它是星期几,那么在Day-of-week字段中就可以使用。
    / 表示一个值的增加幅度,n/m表示从n开始,每次增加m。 minute字段中:3/5表示从3分开始,每隔5分钟执行。

指标追踪弹性伸缩

  • 定义:通过追踪监控指标实现对预留模式的函数实例进行动态伸缩。
  • 适用场景:函数计算系统周期性采集预留的函数实例并发利用率指标,使用该指标并结合您配置的扩容触发值、缩容触发值来控制预留模式函数实例的伸缩,使预留的函数实例量更好的贴合资源的真实使用量。
  • 实现原理:指标追踪弹性伸缩根据指标情况每分钟对预留资源进行一次伸缩。
    • 当指标超过扩容阈值时,开始以积极的策略扩容预留模式的函数实例量,最快速度将函数实例量扩容至目标值。
    • 当指标低于缩容阈值时,开始以保守的策略缩容预留模式的函数实例量,小幅度向缩容目标值贴近。
    如果在系统中设置了伸缩最大值和最小值,此时预留的函数实例量会在最大值与最小值之间进行伸缩,超出最大值时将停止扩容,低于最小值时将停止缩容。
  • 配置示例:instance
    • 当流量不断增加时,触发扩容阈值80%,预留模式的函数实例开始扩容,当达到最大值100时停止扩容,超出部分的请求分配至按量模式函数实例。
    • 当流量不断减小时,触发缩容阈值60%,预留模式的函数实例开始缩容。
预留模式函数实例的并发利用率只统计预留模式的并发情况,不包含按量模式的数据。指标口径:预留模式函数实例正在响应的请求并发值与所有预留函数实例最大可响应并发值的占比,数值范围为[0,1]。对于不同的实例并发数,预留模式的函数实例最大可响应并发值的计算逻辑如下所示。关于实例并发数的具体信息,请参见设置单实例并发数
  • 单实例单并发:最大可响应并发值=函数实例数量
  • 单实例多并发:最大可响应并发值=函数实例数量×单实例并发度
扩缩容目标值:
  • 根据当前指标值、指标追踪值、当前预留模式的函数实例数、缩容系数共同决定。
  • 扩缩容计算原理:缩容时会通过缩容系数来实现相对保守的缩容过程,缩容系数取值范围为(0,1]。缩容系数为系统参数,用于减缓缩容速度,防止缩容过快,您无需设置。扩缩容目标值对计算结果向上取整得到最终结果,计算逻辑如下:
    • 扩容目标值=当前预留模式的函数实例数×(当前指标值/指标追踪值)
    • 缩容目标值=当前预留模式的函数实例数×缩容系数×(1-当前指标值/指标追踪值)
  • 扩容目标值计算示例:当前指标值为80%,指标追踪值为40%,当前预留模式的函数实例数为100,经过计算100×(80%/40%)=200。预留模式的函数实例数会扩容到200,以保证扩容后指标追踪值维持在40%附近。
参数示例:
  • 为service_1的function_1函数配置指标追踪弹性伸缩,配置的生效区间为:2020-11-01 10:00:00至2020-11-30 10:00:00,追踪预留模式函数实例并发利用率ProvisionedConcurrencyUtilization指标,并发利用率追踪值为60%,超过60%时开始扩容,扩容上限为100;并发利用率低于60%时开始缩容,缩容下限为10。
  • {
      "ServiceName": "service_1",
      "FunctionName": "function_1",
      "Qualifier": "alias_1",
      "TargetTrackingPolicies": [
        {
          "Name": "action_1",
          "StartTime": "2020-11-01T10:00:00Z",
          "EndTime": "2020-11-30T10:00:00Z",
          "MetricType": "ProvisionedConcurrencyUtilization",
          "MetricTarget": 0.6,
          "MinCapacity": 10,
          "MaxCapacity": 100,
        }
      ]
    }
  • 参数说明如下:
    参数 说明
    Name 配置的定时任务名称。
    StartTime 配置开始生效的时间,UTC格式。
    EndTime 配置结束生效的时间,UTC格式。
    MetricType 追踪的指标:ProvisionedConcurrencyUtilization。
    MetricTarget 指标的追踪值。
    MinCapacity 扩容的最大值。
    MaxCapacity 缩容的最小值。