函数计算为您提供了按量模式和预留模式两种实例使用模式。其中预留模式的固定预留值会导致实例利用不充分,此时,通过弹性伸缩功能可以解决实例利用不充分的问题。本文介绍两种实例使用模式的功能原理、优缺点、计费方式以及如何在函数计算控制台配置预留实例和配置预留实例的弹性伸缩。

按量模式

按量模式是指函数实例的分配和释放完全由函数计算系统负责,有函数调用请求时,系统动态调度资源,为您提供弹性可靠的执行环境,极大地降低了管理应用资源的难度。

但是资源的动态调度不可避免地存在冷启动延时,对于时延敏感的在线业务有一定影响。

计费方式:无函数调用请求就不会分配实例,不使用则不收费。

预留模式

预留模式是将函数实例的分配和释放交由您管理。当您预留了函数实例,函数计算系统收到函数调用请求时,会优先将请求转发给您预留的函数实例,当函数请求的峰值超过预留的函数实例处理能力时,剩余的部分请求将会转发给您的按量模式的实例,由函数计算系统自动为您分配执行环境。

预留模式下实例的执行环境是长驻的,可以彻底消除冷启动对业务的影响。

计费方式:预留模式下实例的执行时长根据实例的运行时长计费,其执行时长的计量是从函数计算系统启动预留的函数实例开始,到您主动释放为止。因此,即使预留的函数实例未执行任何请求,只要没有释放函数实例,您都需要为预留的函数实例付费。关于具体产品定价和计费,请参见计费概述On-Demand Resources

前提条件

配置预留实例

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

更新预留实例

  1. 登录函数计算控制台
  2. 在左侧导航栏,单击服务及函数
  3. 在顶部菜单栏,选择地域。
  4. 服务列表页面,找到目标服务,在其操作列,选择更多 > 弹性伸缩(含预留资源)
  5. 弹性伸缩(含预留资源)页面,找到目标规则,在其操作列单击编辑
    说明 如果需要删除预留模式的实例,您只需将预留模式实例个数设置为0即可。
  6. 在服务中创建弹性伸缩限制规则页面,修改基础配置、定时修改限制或根据指标修改限制,然后单击保存

配置预留实例的弹性伸缩

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

定时弹性伸缩

  • 定义:通过定时弹性伸缩您可以更加灵活地配置预留的函数实例,在指定时间将预留的函数实例量设定成需要的值,使函数实例量更好地贴合业务的并发量。
  • 适用场景:如果您的函数有明显的周期性规律或可预知的流量高峰,可以使用定时预留功能来提前预留函数实例。当函数调用并发大于定时预留值时,超出的部分会分配至按量模式的函数实例。
  • 配置示例:如下图配置了两个定时操作,在函数调用流量到来前,通过第一个定时配置将预留函数实例扩容至较大的值,当流量减小后,通过第二个定时配置将预留函数实例缩容到较小的值。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",
      "SchedulerActions": [
        {
          "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:00进行调度,则可以使用CRON_TZ=Asia/Shanghai 0 0 4 1 * *
    • Cron expressions - "cron(0 0 4 * * *)":调度多次,使用标准crontab格式,默认以UTC时间运行,即北京时间减去8个小时。如:北京时间每天04:00进行调度,转化为UTC时间就是每天20:00进行调度,则可以使用0 0 4 * * *
    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-当前指标值/缩容阈值)*缩容系数
    • 缩容目标值=当前实例数*(1-缩容比例)
  • 扩缩容目标值计算示例:当前指标90%,扩容阈值80%,当前预留函数实例数为100,经过计算(90%/80%)*100=112.5向上取整得到113,预留模式的函数实例数会扩容到113。
参数示例:
  • 为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 缩容的最小值。