更新时间:2023-05-09 GMT+08:00

配置单实例多并发

该特性仅FunctionGraph v2版本支持。

概述

默认情况下,每个函数实例同一时刻只处理一个请求,多并发时,例如并发三个请求,FunctionGraph会启动三个函数实例处理请求。FunctionGraph推出的单实例多并发能力,可以让您在一个实例上并发处理多个请求。

应用场景

单实例多并发适合函数处理逻辑中有较长时间等待下游服务响应的场景,也适合函数逻辑中初始化时间较长的场景,具备以下优势:

  • 降低冷启动概率,优化函数处理时延:例如并发三个请求,不配置单实例多并发,FunctionGraph默认启动三个实例处理请求,会有三次冷启动。若配置了单实例支持三并发,三个并发请求,FunctionGraph只启动一个实例处理请求,减少了两次冷启动。
  • 减少总请求处理时长,节省费用:单实例单并发下,多个请求的总处理时长为每个请求的处理时长相加。单实例多并发下,同一个实例对并发的多个请求的计费时间为,从第一个请求开始处理计时,到最后一个并发的请求处理结束记一次时长费用。

单实例单并发与单实例多并发的对比

当一个函数执行需要花费5秒,若配置为单实例单并发,三次函数调用请求分别在三个函数实例执行,总执行时长为15秒。

若配置为单实例多并发,设置单实例并发数为5,即单个实例最多支持5个并发请求,如果有三次函数调用请求,将在一个实例内并发处理,总执行时间为5秒。

单实例并发数大于1,在您设置的“单函数最大实例数”范围内,超过单实例并发处理能力时会自动扩容新实例。

表1 单并发与多并发对比

对比项

单实例单并发

单实例多并发

日志打印

-

Node.js Runtime使用console.info()函数,Python Runtime使用print()函数,Java Runtime使用System.out.println()函数打印日志,该方式会把当前请求的Request ID包含在日志内容中。当多请求在同一个实例并发处理时,当前请求可能有很多个,继续使用这些函数打印日志会导致Request ID错乱。此时应该使用context.getLogger(),获取一个日志输出对象,通过这个日志输出对象打印日志,例如Python Runtime:

log = context.getLogger()

log.info("test")

共享变量

不涉及

单实例多并发处理时,修改共享变量会导致错误。这要求您在编写函数时,对于非线程安全的变量修改要进行互斥保护。

监控指标

按实际情况进行监控。

相同负载下,函数的实例数明显减少。

流控错误

不涉及

太多请求时,body中的errorcode为“FSS.0429” ,响应头中的status为429 ,错误信息提示:Your request has been controlled by overload sdk, please retry later。

配置单实例多并发

  1. 登录函数工作流控制台,在左侧的导航栏选择“函数 > 函数列表”。
  2. 选择待配置的函数,单击进入函数详情页。
  3. 选择“设置 > 并发”,开始配置。
    参见表2进行配置,完成后单击“保存”。
    图1 并发基础配置
    表2 参数说明

    参数

    说明

    单实例并发数

    单个实例支持的请求并发数。取值范围为1-1000。

    单函数最大实例数

    单个函数的运行实例数,默认值400,最大值为1000;-1表示不限制实例数;0代表禁用。

    说明:

    超过实例数限制处理能力的请求会被直接丢弃,而不是重试。

    当前超过实例数限制导致的请求错误不会直接显示在函数日志中,您可以通过配置函数异步来获取错误详细信息。

配置约束

  • 对于Python函数,由于Python GIL锁导致实例上的线程被绑定到一个核上,造成多并发无法使用多核,即使配置更大资源规格也无法提升函数处理性能。
  • 对于Node.js函数,由于V8引擎的单进程单线程,造成多并发无法使用多核,即使配置更大资源规格也无法提升函数处理性能。