腾讯云云函数
腾讯云云函数
工作原理:https://cloud.tencent.com/document/product/583/9694
介绍
云函数 (Serverless Cloud Function,SCF)是腾讯云推出的一款 serverless 服务
官方文档的介绍
- 您只需使用平台支持的语言编写代码。腾讯云将完全管理底层计算资源,包括服务器 CPU、内存、网络和其他配置/资源维护、代码部署、弹性伸缩、负载均衡、安全升级、资源运行情况监控等。但这也意味着您无法登录或管理服务器、无法自定义系统和环境。
- 云函数自动地在同一地域内的多个可用区部署,同时提供极高的容错性。云函数在执行时将根据请求负载扩缩容,从每天几个请求到每秒数千个请求,都由云函数底层自行伸缩。您无需人工配置和介入,只需为运行中的云函数付费,即可满足不同情景下服务的可用性和稳定性。若云函数未运行,则不产生任何费用。
- 您可以自定义运行云函数的时机,例如,在 COS Bucket 上传时、删除文件时运行云函数、使用 Ckafka 中的消息时运行云函数、应用程序通过 SDK 调用时运行云函数,或指定云函数定期执行。您可以使用云函数作为 COS 服务的数据处理触发程序轻松实现 IFTTT 逻辑,您也可以通过构建灵活的定时自动化任务,用于覆盖手工完成的操作,轻松构建灵活可控的软件架构。
serverless 与传统服务器的区别
- NoOps,省去了基础设施的运维成本,更专注于业务功能上的开发
- 天然具有弹性伸缩、负载均衡的能力
- 代码片段由事件 / 请求触发(一个云函数只负责一类业务)
- 按量付费,计费粒度可以精确到 1ms
除此之外。腾讯云提供的功能
- 提供日志、监控指标、告警功能
- 与腾讯云其他云组件的联动(容器镜像注册表、对象存储 COS)
FAAS
函数即服务提供了一种直接在云上运行无状态的、短暂的、由事件触发的代码的能力。
- 函数即服务和传统应用架构不同,函数服务提供的是事件触发式的运行方式,每一次触发事件只会执行一个云函数实例。因此在云函数的代码中,仅需考虑针对一个事件的处理流程。
- 为了匹配自动扩缩能力,需要函数代码使用的是无状态开发方式,即不在云函数的运行内存中保留相关的状态数据并在多次运行时依赖这些状态数据。
云函数的状态数据,可以依赖外部的持久存储能力例如云缓存、云数据库、云存储来进行。
并发
基本规则
- 函数被触发后,会分配一个并发实例来处理请求或事件。
- 函数代码运行完毕返回后,该实例会处理其他请求。
- 如果在请求到来时,所有实例都在运行中,云函数则会分配一个新的并发实例。
一实例一事件:云函数遵循一个并发实例同一时刻仅处理一个事件的运行逻辑,保障每个事件的处理效率和稳定性。
并发实例复用与回收
当并发实例处理完事件请求后,不会立刻被回收,而是会保留一段时间以便复用。
- 热启动:在保留期内,如有新的请求事件需要处理,将会优先使用保留中的并发实例,从而实现事件的快速处理。
- 回收:保留期过后,如果没有请求需要该实例处理,云函数平台则会回收该实例。
- 不可定制:并发保留的时间由云函数平台根据情况动态调整,故函数业务代码中不能假设某个特定保留时间进行程序编写。
并发扩容
如果请求到来时,没有该版本的并发实例可以处理该请求,云函数平台会启动新的并发实例来处理。新启动的并发实例在初始化的过程后,便可以处理事件,我们称之为由弹性并发带来的扩容,而弹性并发的扩容速度上限即函数 burst。
在地域维度,每个账号的弹性并发的扩容速度上限(函数 burst)默认限制为 500 个/分钟,即该地域下所有函数在 1 分钟内累计最多可以启动 500 个新的并发实例。如在 1 分钟内已经达到了当前限制,则将无法再启动新的并发实例,持续到下 1 分钟。在此期间有新的并发扩容请求,将会产生扩容受限错误(429 ResourceLimit),
例如,广州地域的账号默认并发额度可以支撑 128MB 函数的 1000 个并发实例。有大量请求到来时,第一分钟可以从 0 个并发实例启动到 500 个并发实例。如果还有请求需要处理,第二分钟可以从 500 个并发实例启动到 1000 个并发实例,直至并发实例可以满足请求的需要或达到并发上限。
函数类型
事件函数与 web 函数
web 函数
- 接收 HTTP 或 WebSocket 请求,通过请求头、请求体获取数据
- 代码编写方式更接近于原生的 web 服务,迁移成本低
- 只能通过 API 网管触发(网关直接透传)
- 不支持异步和重试
事件函数
- 函数入参固定为 JSON 格式的 event 和 context
- context:平台信息,不支持用户自定义
- event:用户自定义信息 / 特殊触发器的传入信息。
- 支持异步
- 适合与其他云组件联动
条目 | 事件函数 | Web 函数 |
---|---|---|
设计思想 | 新的事件驱动架构(EDA)开发模式,通过事件触发函数运行,纯粹纯托管 FaaS,天然与云上产品打通,降低开发门槛,缩短研发周期。 | 应对主流的 Serverlessful 多线程开发模式,解决传统 Web 框架 FaaS 化改造成本高的问题,用户可以直接发送 HTTP 请求到 URL 触发函数执行。 |
编程范式 | 函数入参固定为 JSON 格式的 event 和 context,其中 context 为平台信息,不支持用户自定义,event 为用户自定义信息或格式固定的触发器传入信息。 | 函数接收原生的 HTTP 或 WebSocket 请求,函数的编写方式接近原生的 Web 服务,并可通过请求头、请求体获取事件结构。 |
部署方式 | 代码、镜像 | 代码、镜像 |
触发支持 | 定时触发器、Ckafka 触发器、COS 触发器、API 网关触发器、CLB 触发器、MPS 触发器、TDMQ 触发器、CLS 触发器、云 API。 | API 网关器,支持 HTTP 或者 WebSocket 协议。 |
同步/异步执行 | 同步/异步 | 同步 |
请求多并发 | 不支持 | 支持 |
自定义启动文件 | 不支持 | 支持 |
设置监听端口 | 不需要 | 需要监听固定端口 9000 |
应用场景 | 与云产品事件结合紧密的业务、拆分合适粒度的业务、计算型密集型场景。 | Web 建站、API 服务站点托管。 |
部署方式
代码部署与镜像部署
条目 | 代码部署 | 镜像部署 |
---|---|---|
描述 | 将代码文件上传给 SCF,作为函数的运行代码,在 SCF 提供的基础镜像上运行。 | 指定用户自己制作的镜像作为函数的运行环境。 |
大小限制 | 函数代码 + 关联的层版本代码 ≤ 500 MB(压缩前) | 1 GB(解压前) |
文件形式 | zip | 腾讯云容器镜像服务 |
运行环境 | Python 3.7、Python 3.6、Python 2.7、Node.js 16.13、Node.js 14.18、Node.js 12.16、PHP 8.0、PHP 7.4、PHP 7.2、PHP 5.6、Java11、Java8、Golang 1、CustomRuntime | 无限制 |
设置监听端口 | 不需要 | 需要监听固定端口 9000 |
业务场景 | 基础运行环境可以支持、不需要自定义启动命令等业务场景。 | 基础运行环境暂不支持、原始业务基于镜像构建想快速迁移到云函数等业务场景。 |
触发
触发方式包括 API,SDK,以及其他多种云服务产品的事件(COS, API)
应用场景
需要异步执行的批量文件处理
- 离线任务流水线
- 方案:事件函数 + 镜像部署 + API 触发
- 上传图片时生成缩略图
- 方案:事件函数 + 代码部署 + COS 触发
替代传统的 web 后端服务
- 后端直接部署
需要周期性获取 / 处理的数据
一些坑点
- 云函数的执行环境只提供了位于
/tmp
目录的临文件系统作为临时文件存储空间,大小只有 512M,对任何其他目录的文件写操作都是禁止的。 - COS 触发的返回内容比较凌乱