阿里云函数计算:事件驱动的 Serverless
什么是阿里云函数计算
阿里云函数计算(Function Compute,简称 FC)是一款事件驱动的全托管 Serverless 计算服务。你只需要编写并上传代码,平台就会自动准备好计算资源,以弹性、可靠的方式运行你的代码。你无需管理服务器等基础设施,只需为代码运行期间消耗的资源付费。
- 事件驱动:函数由多种事件源触发,例如 HTTP 请求、对象存储文件上传、消息队列新消息等。
- 全托管:自动伸缩、负载均衡、日志监控、安全保障全部由平台处理。
- 按需付费:只有函数真正运行时才产生费用,闲置时不收费。
- 毫秒级计费:精确到 1 毫秒,资源利用率更高。
函数计算让开发者可以专注于业务逻辑,快速交付无服务器应用。
核心概念
服务与函数
函数计算通过“服务”来组织和管理“函数”。
- 服务:是逻辑上的分组单元,类似于项目或微服务。同一服务下的函数共享配置,例如日志仓库、权限角色、VPC 网络等。
- 函数:是运行的基本单元,包含一段代码、运行时环境、触发器和资源配置(如内存大小、超时时间)。每个函数只处理一种业务逻辑。
事件与触发器
函数不会无缘无故执行,而是被事件驱动。触发器负责将外部事件映射到具体函数。
- 事件:是触发函数运行的数据,以 JSON 格式传递给函数。比如,一个 HTTP 请求的路径、请求头、请求体就是一次事件;对象存储上传完文件后产生的事件包含存储桶名称和文件对象键。
- 触发器:是事件源与函数的绑定。配置好触发器后,一旦事件源产生匹配的事件,函数立刻被调用。常见的触发器类型:
- HTTP 触发器:通过 URL 直接调用函数,适合搭建 API。
- 定时触发器:按 cron 表达式周期性执行函数,适合数据备份、定时任务。
- 对象存储 OSS 触发器:当文件上传、删除时自动处理,适合图片处理、音视频转码。
- 日志服务 SLS 触发器:实时消费日志数据,适合日志清洗、异常告警。
- 消息队列触发器:对接 MNS、Kafka 等,实现异步消息处理。
运行时和自定义容器
函数代码需要运行在特定的运行时环境中。函数计算预先提供了多种标准运行时:
- Python 3.10 / 3.9 / 3.6
- Node.js 16 / 14 / 12
- Java 11 / 8
- Go 1.x
- PHP 7.2
- .NET Core 3.1 / 2.1
- 以及 Custom Runtime 和 Custom Container
如果你需要更灵活的环境,可以使用自定义运行时(Custom Runtime),上传任意语言编写的程序;或者使用自定义容器镜像(Custom Container),直接从容器镜像服务拉取镜像运行,完全自定义操作系统、库和工具。
弹性与实例
函数计算利用函数实例来执行代码。每个实例具有独立的内存、执行环境和临时磁盘空间。平台会根据请求数量自动创建或释放实例。
- 预留实例:为了消除冷启动延迟,可以配置一定数量的常驻实例,立刻响应调用。
- 按量实例:常规情况下,请求到来时由平台快速创建新实例,函数执行完毕后被销毁或保留一小段时间用于复用。
- 实例并发:一个实例可以同时处理多个请求(目前支持的多请求并发度需要运行时配合),进一步提升资源利用率。
适用场景
- Web 与 API 后端:直接用 HTTP 触发器暴露 RESTful API,不需要搭建服务器。
- 数据 ETL 与实时处理:OSS 文件一上传,函数就触发进行数据转换、格式校验并存入数据库;或从消息队列拉取数据做流式处理。
- 自动化运维:定时触发函数检查云资源,自动扩容、备份数据、生成报表。
- 多媒体处理:用户上传图片或视频到 OSS,函数自动压缩、加水印、截图或转码。
- AI 推理:函数集成深度学习模型,提供低延迟推理 API,无需维护 GPU 集群。
- 物联网(IoT):设备上报数据到消息队列,函数进行解析、存储和规则引擎联动。
快速入门:第一个 HTTP 函数
下面通过一个 Node.js 例子,演示如何从零创建一个可通过 URL 访问的函数。你也可以使用 Python、Java 等语言。
步骤一:进入控制台并创建服务
- 登录阿里云函数计算控制台。
- 在左侧导航栏选择“服务及函数”,点击“创建服务”。
- 填写服务名称(例如
my-serverless-app),选择地域,其他可保持默认。点击“确定”完成服务创建。
步骤二:创建函数
-
进入刚刚创建的服务,点击“创建函数”。
-
选择“使用内置运行时创建”,函数名称填入
hello-world。 -
运行时选择 Node.js 16。
-
函数代码方式选择“在线编辑”,在代码编辑框输入以下内容:
module.exports.handler = async (event, context) => { const name = event.queryParameters?.name || '世界'; const body = JSON.stringify({ message: `你好,${name}!欢迎使用函数计算。`, timestamp: Date.now() }); return { statusCode: 200, headers: { 'Content-Type': 'application/json' }, body }; }; -
在“高级配置”中,将内存设为 128 MB,超时时间设为 10 秒,执行角色选择或创建一个有基本权限的 RAM 角色。
-
点击“创建”。
步骤三:配置 HTTP 触发器
- 在函数详情页,点击“触发器”标签,然后“创建触发器”。
- 选择“HTTP 触发器”。
- 认证方式选择“anonymous”(无需签名即可访问,仅适合测试)或“function”(需要鉴权,安全推荐)。
- 请求方法选择
GET和POST。 - 点击“确定”。系统会为该触发器生成一个公网访问地址,格式类似:
https://1234567890.cn-hangzhou.fc.aliyuncs.com/2016-08-15/proxy/my-serverless-app/hello-world/
步骤四:测试函数
在浏览器或使用 curl 访问触发器地址,并带上查询参数:
curl "https://你的触发器地址?name=阿里云"
预期返回:
{
"message": "你好,阿里云!欢迎使用函数计算。",
"timestamp": 1717001234567
}
开发与部署流程
本地开发与调试
函数计算提供多种工具帮助你在本地开发:
- Funcraft:命令行工具,可以初始化项目、本地运行、部署函数。支持通过
fun local start在本地模拟 HTTP 触发器。 - Serverless Devs:函数计算推荐的 Serverless 应用全生命周期管理工具。支持 YAML 描述资源,提供
s local invoke本地调用、s deploy一键部署。 - API 与 SDK:可使用 Python、Java 等 SDK 直接管理函数,适合集成进 CI/CD。
部署方式
- 控制台上传:适合简单测试,直接在代码编辑器中粘贴代码或上传 ZIP 包。
- 命令行部署:使用
fun deploy或s deploy将本地代码打包上传。 - 容器镜像部署:编写 Dockerfile,构建镜像后推送到阿里云容器镜像服务,然后在创建函数时选择“使用容器镜像”,指定镜像地址。
- CI/CD 自动化:在代码仓库中配置流水线(如 GitHub Actions、阿里云效),在推送代码后自动构建并部署函数。
日志与监控
- 函数计算自动将标准输出和错误日志集成到阿里云日志服务 SLS。
- 在控制台函数详情页的“日志查询”中,可以实时查看每次调用的日志。
- 在“监控图表”中可查看调用次数、执行时间、错误率、流量等关键指标。
- 可设置告警规则,当错误率升高或延迟超过阈值时发送通知。
最佳实践建议
- 无状态设计:函数实例可能被随时回收,不要依赖本地文件系统或实例内存保存状态。状态可保存在对象存储 OSS、表格存储 Tablestore 或数据库中。
- 合理设置内存和超时:内存大小与 CPU 成正比,根据性能测试结果调整,避免资源浪费。同时为函数设置合理的超时时间,防止异常导致长时间运行。
- 使用预留实例消除冷启动:对于延迟敏感的在线服务,可配置预留实例。配合按量实例实现成本与性能的平衡。
- 细化职责:一个函数只做一件事情。通过工作流(如阿里云函数工作流 FnF)将它们编排成复杂的流程。
- 环境变量管理配置:将数据库连接字符串、API 密钥等存储在函数配置的环境变量中,代码中通过
context.credentials或环境变量读取,避免硬编码。
支付宝小程序云函数
如果你是支付宝小程序开发者,函数计算还提供了支付宝小程序云函数方案。在小程序端直接定义云函数,无需管理服务器即可快速实现后端逻辑。开发流程与标准函数计算类似,但在小程序 IDE 中内置了便捷的部署和调试支持,适合快速构建轻量级全栈应用。
总结
阿里云函数计算把基础设施的复杂性完全屏蔽,让开发者可以快速响应业务需求,用更少的代码、更低的管理成本构建弹性伸缩的应用。从简单的 Web API 到复杂的事件处理流水线,它都能提供合适的 Serverless 计算能力。接下来,你可以尝试编写自己的函数,结合 OSS、消息队列等服务,感受无服务器架构的便利。