产品概述
腾讯云无服务器云函数(Serverless Cloud Function,SCF)是腾讯云为企业和开发者们提供的无服务器执行环境,帮助您在无需购买和管理服务器的情况下运行代码。您只需使用平台支持的语言编写核心代码并设置代码运行的条件,即可在腾讯云基础设施上弹性、安全地运行代码。SCF 是实时文件处理和数据处理等场景下理想的计算平台。
计算资源的变迁
随着云服务的发展,计算资源高度抽象化,腾讯云提供了从物理服务器到云函数的、横跨各种抽象程度的计算资源供用户选择。
- 黑石物理服务器:以物理机为扩展单位。用户完全拥有整台实体计算资源,安全性最好。
- 云服务器:以云服务器为扩展单位,虚拟化硬件设备。用户和其他租户共享物理机资源,仍可自行配置 CVM 的各项指标,相对部署和迭代更加简单。
- 容器:以服务为扩展单位,虚拟化操作系统。测试和生产环境完全一致,测试和部署非常轻松。
- 无服务器云函数:以函数为扩展单位,虚拟化运行时环境(Runtime)。是现有计算资源的最小单位,具有完全自动、一键部署、高度可扩展等特点,是轻量级服务部署非常好的选择。
什么是无服务器 Serverless
Serverless 并不代表没有了服务器,只是用户不再需要关心这些底层资源了。当然,这也意味着用户无法登录服务器,并且也不需要想办法优化它。开发者只需关心最核心的代码片段,跳过复杂的、无聊的其他工作。这些代码完全由事件触发(event-trigger),平台根据请求自动平行调整服务资源,拥有近乎无限的扩容能力,空闲时则没有任何资源在运行。代码运行无状态,可以轻易实现快速迭代、极速部署。
腾讯云无服务器云函数简介
腾讯云云函数是腾讯云提供的无服务器(Serverless)执行环境。您只需编写简单的、目的单一的云函数,并将它与您的腾讯云基础设施及其他云服务产生的事件关联起来。
使用云函数时,用户只需关注自己的代码。腾讯云完全管理底层计算资源,包括服务器 CPU、内存、网络和其他配置/资源维护、代码部署、弹性伸缩、负载均衡、安全升级、资源运行情况监控等,用户只需使用平台支持的语言(目前支持 Python,Nodejs,Java)提供代码。同时,这意味着您无法登录或管理服务器、无法自定义系统和环境。
代码在执行时将根据请求负载扩缩容,无需人工配置和介入即可满足不同情景下服务的可用性和稳定性,从每天几个请求到每秒数千个请求,都由云函数底层自行伸缩。云函数自动地在地域内的多个可用区部署,提供极高的容错性。用户只需为运行中的云函数付费,代码未运行时不产生任何费用。
您可以自定义何时运行您的代码,比如在 COS Bucket 上传或删除了文件时、应用程序通过 SDK 调用了代码时,或自行指定代码定期执行。因此,您可以使用云函数作为 COS 服务的数据处理触发程序,轻松实现 IFTTT 逻辑。也可构建灵活的定时自动化任务来覆盖手工完成的操作,轻松构建灵活可控的软件架构。
如果用户需要管理您的计算资源,腾讯云还为您提供以下计算服务:
- 云服务器 提供各种规格的实例配置,您可以自定义计算资源的 CPU、内存、操作系统、网络、安全等各项配置,但您需要自定义策略完成跨可用区容错、资源伸缩等。
- 容器服务 提供高度可扩展的容器管理服务,您可以根据资源需求和可用性要求在您的集群中安排容器,满足业务或应用程序的特定要求。
腾讯云无服务器云函数(Serverless Cloud Function,SCF)为函数即服务 (Function as a Service,FaaS)产品,提供无服务器(Serverless) 和 FaaS 的计算平台。运行方式依赖事件触发。因此在和触发事件源结合时,云函数就可以被触发源所产生的事件触发运行。
相关概念
无服务器
无服务器架构说法的来源可以根据 Mike Roberts 在 Martin Fowler 的博客网站上发表的 无服务器架构 一文中得到解释。
无服务器并不是没有服务器就能够进行计算,而是对于开发者来说,无需了解底层的服务器情况,也能使用到相关资源,因此称为无服务器。
无服务器也可以从更广的角度来识别,针对无需配置和了解底层的服务器就可以直接使用的云服务,在一定程度上也可以称为无服务器。
在无服务器云函数 SCF 产品中,我们针对的是无服务器场景中的计算场景。云函数产品提供的是无服务器模式下的 FaaS 能力。
函数即服务
函数即服务提供了一种直接在云上运行无状态的、短暂的、由事件触发的代码的能力。
函数即服务和传统应用架构不同,函数服务提供的是事件触发式的运行方式,云函数不是始终运行的状态,而是在事件发生时由事件触发运行,并且在一次运行的过程中处理这一次事件。因此在云函数的代码中,仅需考虑针对一个事件的处理流程,而针对大量事件的高并发处理,由平台实现云函数的多实例并发来支持。
为了实现对高并发的支持,云函数平台提供了自动的弹性伸缩能力,会在有大量请求到来时启动更多实例来处理事件请求,也会在没有事件到来时缩减函数实例甚至到零实例。因此为了匹配自动扩缩能力,需要函数代码使用的是无状态开发方式,即不在云函数的运行内存中保留相关的状态数据并在多次运行时依赖这些状态数据。云函数的状态数据,可以依赖外部的持久存储能力例如云缓存、云数据库、云存储来进行。
触发器和触发源
任何可以产生事件,触发云函数执行的均可以被称为触发器或触发源。触发器在本身产生事件后,通过将事件传递给云函数来触发函数运行。
触发器在触发函数时,可以根据自身特点,使用同步或异步方式触发函数。同步方式触发函数时,触发器将等待函数执行完成并获取到函数执行结果;异步方式触发函数时,触发器将仅触发函数而忽略函数执行结果。
腾讯云无服务器云函数在和腾讯云的某些产品或服务对接时,也有自身实现的一些特殊方式,例如推(PUSH)模式和拉(PULL)模式。
- 推模式:触发器主动将事件推送至云函数平台并触发函数运行。
- 拉模式:云函数平台通过拉取模块,从触发器中拉取到事件并触发云函数运行。
触发事件
触发器在触发函数时会将事件传递给云函数。事件在传递时以一个特定的数据结构体现,数据结构格式在传递时均为 JSON 格式,并以函数 event 入参的方式传递给云函数。
触发事件的 JSON 数据内容,在不同的语言环境下将会转换为各自语言的数据结构或对象,无需在代码中自行进行从 JSON 结构到数据结构的转换。
例如,在 Python 环境中,JSON 数据内容会转变为一个复杂 dict 对象,即函数的入参 event 就是一个 Python 的复杂 dict 对象。而在 Golang 或 Java 中,入参是一个需要和 event 数据结构可以匹配的对象。更具体的实现方式可以见 开发语言说明。
工作原理
函数运行时的容器模型
SCF 将在事件触发时代表您执行 SCF 函数,根据您的配置信息(如内存大小等)进行资源分配,并启动和管理容器(即函数的执行环境)。SCF 平台负责所有函数运行容器的创建、管理和删除清理操作,用户没有权限对其进行管理。
在容器启动时需要一些时间,这会使得每次调用函数时增加一些延迟。但是,通常仅在首次调用函数、更新函数、或长时间未调用时重新调用时会察觉到此延迟,因为平台为了尽量减少此启动延时,会尝试对后续调用重用容器,在调用函数后容器仍会存留一段时间,预期用于下次调用。在此段时间内的调用会直接重用该存留的容器。
容器重用机制的意义在于:
- 用户代码中位于 执行方法 外部的任何声明保持已初始化的状态,再次调用函数时可以直接重用。例如,如果您的函数代码中建立了数据库连接,容器重用时可以直接使用原始连接。您可以在代码中添加逻辑,在创建新连接之前检查是否已存在连接。
- 每个容器在
/tmp
目录中提供部分磁盘空间。容器存留时该目录内容会保留,提供可用于多次调用的暂时性缓存。再次调用函数时有可能可以直接使用该磁盘内容,您可以添加额外的代码来检查缓存中是否有您存储的数据。
注意:
请勿在函数代码中假定始终重用容器,因为是否重用和单次实际调用相关,无法保证是创建新容器还是重用现有容器。
临时磁盘空间
SCF 函数在执行过程中,都拥有一块 512MB 的临时磁盘空间 /tmp
,用户可以在执行代码中对该空间进行一些读写操作,但这部分数据可能 不会 在函数执行完成后保留。因此,如果您需要对执行过程中产生的数据进行持久化存储,请使用 COS 或 Redis/Memcached 等外部持久化存储。
调用类型
SCF 平台支持同步和异步两种调用方式来调用云函数。调用类型与函数本身的配置无关,只有在调用函数时才能控制调用类型。
- 同步调用函数将会在调用请求发出后持续等待函数的执行结果返回
- 异步调用将不会等待结果返回,只发出请求并获得当前请求的 Request ID。
以下调用场景您可以自由定义函数的调用类型:
- 编写的应用程序调用 SCF 函数。如果您需要同步调用,请在 InvokeFunction 接口中传入参数
invokeType=RequestResponse
;如果您需要异步调用则请传入参数invokeType=Event
。 - 手动调用 SCF 函数(使用 API 或 CLI)用于测试。调用时的参数区别同上。
但是,在您使用腾讯云其他云服务作为事件源时,云服务的调用类型是预定义的,用户无法在这种情况下自由指定调用类型。例如,COS 和定时器始终异步调用 SCF 函数。
用户限制
函数相关的使用配额及相关环境限制,可见 配额及限制。
函数并发量
函数的并发数量是指在任意指定时间对函数代码的执行数量。对于当前的 SCF 函数来说,每个发布的事件请求就会执行一次。因此,这些触发器发布的事件数(即请求量)会影响函数的并发数。您可以使用以下公式来估算并发的函数实例总数目。
- [](javascript: void 0;)
每秒请求量 * 函数执行时间(按秒)
例如,考虑一个处理 COS 事件的函数,假定函数平均用时0.2秒(即200毫秒),COS 每秒发布300个请求至函数。这样将同时生产 300 * 0.2 = 60 个函数实例。
并发限制
当前默认情况下,SCF 对每个函数的并发量有一定限制,您可以通过查看 配额及限制 了解当前函数的并发量限制。您可以通过 联系我们 来调高此数值。
如果调用导致函数的并发数目超过了默认限制,则该调用会被阻塞,SCF 将不会执行这次调用。根据函数的调用方式,受限制的调用的处理方式会有所不同:
- 同步调用:如果函数被同步调用时受到限制,将会直接返回429错误。
- 异步调用:如果函数被异步调用时受到限制,SCF 将在一定的时间内以固定的频率自动重试受限制的事件。
重试机制
如果您的函数因为超过最大并发数目、或遇到平台内部资源不足等内部限制导致失败。此时,如果您的函数被同步调用,将会直接返回错误(见上面并发执行限制内容)。如果您的函数被内部云服务使用异步方式调用,则该次调用将会自动进入一个重试队列,SCF 将自动重试调用。
执行环境和可用库
当前 SCF 的执行环境建立在以下基础上:
- 标准 CentOS 7.2
如果需要在代码中包含可执行的二进制文件、动态库或静态库,请都确保兼容此执行环境。
基于不同语言环境,在 SCF 执行环境下有相关语言的基础库及安装的附加库,您可以在各个语言说明中查看环境中已安装的附加库: