预留模式通过预留适量函数实例来响应函数调用请求,降低冷启动的发生次数,为时延敏感的在线业务提供更好的服务响应。由于预留模式配置的固定预留值会导致预留函数实例利用不充分,您可以通过定时弹性伸缩和指标追踪弹性伸缩两种模式解决该问题。

定时弹性伸缩

  • 定义:通过定时弹性伸缩您可以更加灵活地配置预留的函数实例,在指定时间将预留的函数实例量设定成需要的值,使函数实例量更好地贴合业务的并发量。
  • 适用场景:如果您的函数有明显的周期性规律或可预知的流量高峰,可以使用定时预留功能来提前预留函数实例。当函数调用并发大于定时预留值时,超出的部分会分配至按量模式的函数实例。
  • 配置示例:如下图配置了两个定时操作,在函数调用流量到来前,通过第一个定时配置将预留函数实例扩容至较大的值,当流量减小后,通过第二个定时配置将预留函数实例缩容到较小的值。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 * * *)"
        }
      ]
    }
  • 参数说明
    参数 说明 Schema
    Name 配置的定时任务名称。 string
    StartTime 配置开始生效的时间,UTC格式。 string
    EndTime 配置结束生效的时间,UTC格式。 string
    TargetValue 目标值。 integer(int64)
    ScheduleExpression 定时信息,支持两种格式:
    • At expressions - "at(yyyy-mm-ddThh:mm:ss)":只调度一次,使用UTC格式。
    • Cron expressions - "cron(0 0 20 * * *)":调度多次,使用标准crontab格式,如:每天20:00进行调度。
    string
    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,
        }
      ]
    }
  • 参数说明:
    参数 说明 Schema
    Name 配置的定时任务名称。 string
    StartTime 配置开始生效的时间,UTC格式。 string
    EndTime 配置结束生效的时间,UTC格式。 string
    MetricType 追踪的指标:ProvisionedConcurrencyUtilization。 string
    MetricTarget 指标的追踪值。 double
    MinCapacity 扩容的最大值。 integer(int64)
    MaxCapacity 缩容的最小值。 integer(int64)