文档

创建Web函数

更新时间:

如果您想基于各个语言的流行框架如Flask、Express、SpringBoot或自定义容器镜像等编写程序,或者迁移已有的框架应用,请选择创建Web函数。通过设置实例并发度,您可以在流量高峰期有效管理资源使用,降低冷启动影响,从而提升性能和控制成本。

创建函数

  1. 登录函数计算控制台,在左侧导航栏,单击函数

  2. 在顶部菜单栏,选择地域,然后在函数页面,单击创建函数

  3. 创建函数页面,选择Web函数,配置以下配置项,然后单击创建

    • 基本设置:设置函数名称

    • 函数代码:配置函数的运行环境和代码相关信息。

      配置项

      说明

      示例

      运行环境

      选择您熟悉的语言,例如Python、Java、PHP、Node.js或自定义容器等。

      Node.js 16

      代码上传方式

      选择代码上传到函数计算的方式。

      • 使用示例代码:默认方式,您可以根据业务需要选择函数计算为您提供的创建函数的示例代码。

      • 通过 ZIP 包上传代码:选择函数代码ZIP包并上传。

      • 通过文件夹上传代码:选择包含函数代码的文件夹并上传。

      • 通过 OSS 上传代码:选择上传函数代码的Bucket 名称文件名称

      • 使用示例镜像:选择函数计算自带的示例镜像。

      • 使用ACR中的镜像:选择 ACR 中的镜像,在弹出的选择容器镜像面板,选择已创建的容器镜像实例ACR 镜像仓库,然后在下方选择镜像区域找到目标镜像并在其右侧操作列单击选择

        说明

        不支持使用跨账户ACR中的公开镜像创建函数。

      使用示例代码

      启动命令

      程序的启动命令。如果不配置启动命令,您需要在代码的根目录手动创建一个名称为bootstrap的启动脚本,您的程序通过此脚本来启动。

      npm run start

      监听端口

      您的代码中的HTTP Server所监听的端口。

      9000

    • 高级配置:配置函数的实例相关信息和函数执行超时时间等。

    • 配置项

      说明

      示例

      规格方案

      根据您的业务情况,选择或手动输入合理的vCPU规格内存规格组合。关于各资源使用的计费详情,请参见计费概述

      说明

      vCPU大小(单位为核)与内存大小(单位为GB)的比例必须设置在1∶1到1∶4之间。

      0.35核,512 MB

      临时硬盘大小

      根据您的业务情况,选择临时存储文件的硬盘大小。

      取值说明如下。

      • 512 MB:默认值。不计费,函数计算为您提供512 MB以内的硬盘免费使用额度。

      • 10 GB:按9.5 GB进行计费。

      说明

      临时硬盘中所有目录可写,共享临时硬盘的空间。

      临时硬盘大小与底层执行函数的实例生命周期一致,实例被系统回收后,硬盘上的数据也会消失。如您需要对文件进行持久化保存,可以选择挂载NAS或OSS。具体操作,请参见配置NAS文件系统配置OSS对象存储

      512 MB

      执行超时时间

      设置超时时间。执行超时时间默认为60秒,最长为86400秒。

      60

      单实例并发度

      说明

      当您创建函数的方式选择Web函数容器镜像时,需设置此配置项。

      函数计算支持一个实例同时并发执行多个请求,这个值用来配置单个函数实例可以同时处理多少个请求。具体操作,请参见设置单实例并发度

      20

      时区

      选择函数的时区。在此处设置函数的时区后,将自动为函数添加一条环境变量TZ,其值为您设置的目标时区。

      UTC

      函数角色

      函数计算平台会使用这个RAM角色来生成访问您的阿里云资源的临时密钥,并传递给您的代码。更多信息,请参见授予函数计算访问其他云服务的权限

      mytestrole

      允许访问 VPC

      是否允许函数访问VPC内资源。更多信息,请参见配置网络

      专有网络

      允许访问 VPC选择时必填。创建新的VPC或在下拉列表中选择要访问的VPC ID。

      fc.auto.create.vpc.1632317****

      交换机

      允许访问 VPC选择时必填。创建新的交换机或在下拉列表中选择交换机ID。

      fc.auto.create.vswitch.vpc-bp1p8248****

      安全组

      允许访问 VPC选择时必填。创建新的安全组或在下拉列表中选择安全组。

      fc.auto.create.SecurityGroup.vsw-bp15ftbbbbd****

      允许函数默认网卡访问公网

      是否允许函数可以通过默认网卡访问公网。关闭后,当前服务中的函数将无法通过函数计算的默认网卡访问公网。

      重要

      使用固定公网IP地址功能时,您必须关闭允许函数默认网卡访问公网,否则配置的固定公网IP地址不生效。更多信息,请参见配置固定公网IP地址

      日志功能

      是否启用阿里云日志服务。取值说明如下:

      • 启用:函数的执行日志被持久化保存到日志服务,方便您进行代码调试、故障分析和数据分析等。

      • 禁用:函数的执行日志将无法通过日志服务存储和查询。

      启用

    • 环境变量:设置函数运行环境中的环境变量。更多信息,请参见配置环境变量

  4. 函数创建成功后进入函数详情页,您可以在代码页签修改函数代码、部署代码及测试函数。

说明
  • 更新函数:函数创建成功后,您可以在配置页签,按需修改相应的配置项。

  • 删除函数:您也可以在函数列表页、函数详情页根据提示删除不需要的函数。

设置单实例并发度

实例并发度指定了每个函数实例可以同时处理的最大并发请求数。通过在函数计算中设置实例并发度,您可以在流量高峰期有效管理资源使用,降低冷启动影响,从而达到提升性能和控制成本的目的。

背景信息

函数计算按实例执行时长计费。假设同时有3个请求需要处理,每个请求需要10秒,并发度不同执行时长也不同。

  • 当实例并发度设置为1时,每个实例同时只能处理1个请求,函数计算需要创建3个实例来处理这3个请求,总的执行时长是30秒。

  • 当实例并发度设置为10时,每个实例同时可以处理10个请求,函数计算只需要创建1个实例就能处理这3个请求,总的执行时长是10秒。

说明

默认情况下,函数的实例并发度为1,也就是一个实例同时只会处理一个请求。当您设置单实例并发度大于1后,函数计算在弹性伸缩时,充分利用完一个实例的并发度后才会创建新的实例。

实例并发度设置为不同的值时,请求执行的区别如下图所示。

image

应用场景

单实例多并发功能适用于函数中有较多时间在等待下游服务响应的场景。等待响应一般不消耗资源,在一个实例内并发处理,不仅可以节省费用,还能提高应用响应能力和吞吐量。

优势

  • 减少执行时长,节省费用。

    例如,偏I/O的函数可以在一个实例内并发处理,减少实例数从而减少总的执行时长。

  • 请求之间状态可共享。

    多个请求可以在一个实例内共用数据库连接池,从而减少和数据库之间的连接数。

  • 降低冷启动概率。

    由于多个请求可以在一个实例内处理,创建新实例的次数会变少,冷启动概率降低。

  • 减少VPC IP地址的占用。

    在相同负载下,单实例多并发可以降低总的实例数,从而减少VPC IP地址的占用。

    重要

    您的VPC绑定的vSwitch中至少需要两个可用的IP地址,否则可能会导致服务不可用造成请求失败。

使用限制

限制项

描述

支持的Runtime

  • Custom Runtime

  • Custom Container

单实例并发度取值范围

1~200

调用响应中的函数日志(X-Fc-Log-Result)

实例并发数>1时不支持

操作步骤

您可以在创建或更新函数时,指定函数的单实例并发度。

说明

使用Web 函数创建函数时,可以配置单实例并发度。

dg-instance-concurrency

如果您使用了预留模式,预留模式下的函数也可以并发处理多个请求。更多信息,请参见配置预留实例

设置单实例多并发的影响

设置了单实例多并发(实例并发数>1)之后,与单实例单并发(实例并发数=1)在以下几个方面有区别。

计费

单实例单并发与单实例多并发在执行时长上会不同,从而费用也不同。更多计费详情,请参见计费概述

单实例单并发

函数实例在同一时间只能处理1个请求,1个请求处理完了再处理下一个请求。计费时长从处理第一个请求开始,到最后一个请求结束为止。

image

单实例多并发

多个请求在一个实例并发处理时,以实例的实际占用时间作为计费的执行时长,即从第一个请求开始,到最后一个请求结束期间的时长。

image

并发度流控

函数计算在一个地域中按量实例数的上限默认值为300,一个地域可以同时处理的最大请求数为“300×实例并发数”。例如,设置实例并发数=10时,则一个地域最多允许同时处理3000个并发请求。当并发请求数超过函数计算可以处理的最大请求数时,会收到流控错误提示ResourceExhausted

说明

如您需要扩大某个地域的按量实例数上限,请联系我们

日志

  • 在单并发模式下,在调用函数时指定HTTP头X-Fc-Log-Type: Tail函数计算会在响应头X-Fc-Log-Result中包含本次调用所产生的函数日志。在多并发模式下,由于多个请求并发执行,无法获取某个特定请求的日志,响应头中不再包含本次调用的函数日志。

  • 针对Node.js Runtime,原来的日志方式是使用console.info()函数,该方式会把当前请求的Request ID包含在日志内容中。当多请求在同一个实例并发处理时,当前请求可能有很多个,继续使用console.info()打印日志会导致Request ID错乱,Request ID都会变成req 2。打印日志示例如下。

    2019-11-06T14:23:37.587Z req1 [info] logger begin
    2019-11-06T14:23:37.587Z req1 [info] ctxlogger begin
    2019-11-06T14:23:37.587Z req2 [info] logger begin
    2019-11-06T14:23:37.587Z req2 [info] ctxlogger begin
    2019-11-06T14:23:40.587Z req1 [info] ctxlogger end
    2019-11-06T14:23:40.587Z req2 [info] ctxlogger end
    2019-11-06T14:23:37.587Z req2 [info] logger end
    2019-11-06T14:23:37.587Z req2 [info] logger end                    

    此时应该使用context.logger.info()函数打印日志,该方式仍保留了请求的独立Request ID。代码示例如下。

    exports.handler = (event, context, callback) => {
        console.info('logger begin');
        context.logger.info('ctxlogger begin');
    
        setTimeout(function() {
            context.logger.info('ctxlogger end');
            console.info('logger end');
            callback(null, 'hello world');
        }, 3000);
    };                   

错误处理

多个请求在一个实例并发处理时,由于一个请求处理不当导致进程退出或者崩溃,会导致正在并发处理的其他请求也收到错误信息。这要求您在编写函数时,尽量捕获请求级别的异常,不影响其他请求。Node.js代码示例如下。

exports.handler = (event, context, callback) => {
    try {
        JSON.parse(event);
    } catch (ex) {
        callback(ex);
    }

    callback(null, 'hello world');
};                    

共享变量

多个请求在一个实例并发处理时,同时修改一个共享的变量,可能会导致错误。这要求您在编写函数时,对于非线程安全的变量修改要进行互斥保护。Java代码示例如下。

public class App implements StreamRequestHandler
{
    private static int counter = 0;

    @Override
    public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context) throws IOException {
        synchronized (this) {
            counter = counter + 1;
        }
        outputStream.write(new String("hello world").getBytes());
    }
}                    

监控指标

设置函数的实例并发度后,在相同的负载下,可以在控制台的函数按量实例数监控图中看到函数已使用的实例数明显地减少。实例数据监控图

相关文档

  • 除控制台外,函数计算还提供API的方式来管理函数,具体请查看函数