
阿里云函数计算(Function Compute,简称 FC)是事件驱动的全托管 Serverless 计算服务。不需要管理任何服务器,只需要上传代码,FC 自动分配计算资源,有请求时运行,没有请求时缩容到零,按实际执行时间和调用次数计费。
2024 年底发布的 FC 3.0 是当前的主要版本,相比 FC 2.0 做了一个重要的架构简化:取消了 Service 层级。FC 2.0 需要先创建 Service,再在 Service 下创建 Function,资源组织分两层。FC 3.0 中函数成为一等公民,直接创建和管理函数,不再需要 Service 的包裹,配置更直观,控制台操作路径更短。
FC 解决什么问题
传统的后端服务部署在 ECS 上,无论有没有请求,服务器 24 小时运行,持续产生计算费用。FC 改变了这个计费模式:函数只在被触发时运行,运行完成后实例进入待机状态,待机超过一定时间后自动销毁,下次有请求时重新创建实例。整个过程中,计费只发生在函数实际运行的时段。
这个模式在流量不均衡的场景下成本优势明显。一个每天只在工作时间有请求、晚上几乎没有流量的后台 API,部署在 ECS 上需要为夜间的空闲时间付费;放在 FC 上,晚上没有请求就没有计算费用,只需要为流量实际到来时的执行时长付费。
FC 的另一个价值是弹性。请求量从每秒 1 个突增到每秒 10,000 个时,FC 自动在毫秒级内扩容实例处理请求,不需要提前配置 Auto Scaling 策略,也不需要预估峰值容量。
函数类型:HTTP 函数与事件函数
FC 3.0 中,函数按调用方式分为两种类型:HTTP 函数和事件函数。选择哪种类型,取决于函数的触发方式和请求格式。
HTTP 函数通过 HTTP 触发器接收请求,函数入口接收标准的 HTTP 请求对象(方法、路径、请求头、请求体),返回标准 HTTP 响应。适合构建 Web API、Webhook 处理端点、微服务接口。HTTP 函数的请求响应格式和传统 Web 框架一致,Express(Node.js)、Flask(Python)、Spring Boot(Java)等框架可以直接在 FC 上运行,不需要修改任何代码。
事件函数通过各种事件源触发,入口函数接收事件对象(包含事件类型和相关数据),处理完成后返回处理结果。适合响应 OSS 文件上传、消息队列消息、定时任务等非 HTTP 场景。
两种函数类型的配置方式略有不同,但运行时和计费规则完全相同。
创建函数
在阿里云控制台搜索「函数计算 FC」,进入后点击「创建函数」,选择运行时和触发器类型。以 Python 3.10 的 HTTP 函数为例,最简单的函数代码:
import json
def handler(environ, start_response):
context = environ.get(‘fc.context’)
request_uri = environ.get(‘REQUEST_URI’)
# 处理业务逻辑
response_body = json.dumps({
‘message’: ‘Hello from Alibaba Cloud FC’,
‘path’: request_uri
})
# 返回 HTTP 响应
status = ‘200 OK’
response_headers = [
(‘Content-type’, ‘application/json’),
(‘Content-Length’, str(len(response_body)))
]
start_response(status, response_headers)
return [response_body.encode()]
FC 3.0 支持在控制台内直接编辑和部署代码(适合简单函数),也支持上传代码包(ZIP 文件)或使用容器镜像部署。容器镜像部署适合有复杂依赖、或者需要自定义运行时环境的函数,镜像存储在阿里云容器镜像服务(ACR)中,FC 直接拉取运行。
函数创建时需要配置的关键参数:
运行时:选择代码使用的语言版本,例如 Python 3.10、Node.js 18、Java 17。选定后可以修改,但修改运行时需要确认代码兼容性。
内存和 CPU 规格:FC 3.0 支持独立配置 vCPU 数量和内存大小,不再强制绑定。内存从 128MB 到 32GB,vCPU 从 0.05 核到 16 核,按实际使用量计费。建议从较小规格开始(0.35 vCPU + 512MB),观察实际运行的内存和 CPU 占用后再调整。
超时时间:函数允许运行的最长时间,超出后强制终止并返回超时错误。默认 60 秒,最长 86,400 秒(24 小时)。长时间运行的批处理任务适合设置较长的超时时间。
常用触发器配置
触发器定义了哪类事件可以触发函数执行。FC 支持的触发器类型覆盖了阿里云主要的事件源。
HTTP 触发器
HTTP 触发器是最常用的触发器类型,创建后 FC 自动分配一个 HTTPS 访问地址,所有发到这个地址的 HTTP 请求都会触发函数执行。通过 aliyun CLI 创建 HTTP 触发器:
aliyun fc CreateTrigger \
–functionName my-api \
–triggerType http \
–triggerName http-trigger \
–triggerConfig ‘{“authType”:”anonymous”,”methods”:[“GET”,”POST”]}’
HTTP 触发器支持同步调用(等待函数执行完成返回结果)和异步调用(立即返回,函数在后台执行)。异步调用通过在请求头中添加 X-Fc-Invocation-Type: Async 实现,适合处理时间较长、客户端不需要等待结果的任务。
如果需要绑定自定义域名,在 FC 控制台「域名管理」中配置自定义域名,将域名 CNAME 指向 FC 分配的默认域名即可。
定时触发器
定时触发器按照 Cron 表达式定期触发函数,实现周期性任务。通过控制台配置定时触发器时,指定 Cron 表达式和触发的时区:
{
“cronExpression”: “0 0 2 * * *”,
“enable”: true,
“payload”: “{\”task\”: \”daily_cleanup\”}”
}
上面的配置表示每天北京时间凌晨 2 点触发一次,触发时将 payload 中的 JSON 数据作为事件传入函数。适合每日数据清理、定期报表生成、缓存预热、数据同步等定时任务场景。
OSS 触发器
OSS 触发器在 OSS 存储桶发生特定事件时自动触发函数,最常见的场景是文件上传后自动处理。例如,用户上传图片到 OSS 存储桶,OSS 触发器立即调用 FC 函数执行图片压缩、格式转换或内容审核,处理结果写回 OSS 或发到其他系统。
关于 OSS 存储桶的创建和权限配置,可以参考 阿里云 OSS 云存储完整教程。配置 OSS 触发器时,需要指定触发的事件类型(对象创建、对象删除)、前缀过滤(只对特定目录下的文件触发)和后缀过滤(只对特定格式的文件触发):
import json
import oss2
import os
def handler(event, context):
# OSS 事件触发时,event 包含文件信息
event_data = json.loads(event)
events = event_data.get(‘events’, [])
for oss_event in events:
bucket_name = oss_event[‘oss’][‘bucket’][‘name’]
object_key = oss_event[‘oss’][‘object’][‘key’]
print(f”触发文件: {bucket_name}/{object_key}”)
# 在这里处理文件
# 例如:下载文件、处理、上传回 OSS
process_file(bucket_name, object_key, context)
return ‘success’
EventBridge 触发器
EventBridge 是阿里云的事件总线服务,连接 100 多个阿里云云服务。通过 EventBridge 触发器,函数可以响应来自 ECS 状态变更、RDS 告警、云监控告警、CDN 事件等几乎所有阿里云产品的事件,是构建云上事件驱动架构最通用的触发器类型。
冷启动与预留实例
冷启动是 FC 使用中最常被讨论的性能问题。当函数长时间没有请求,实例被回收后,下一次请求到来时需要重新创建实例、加载运行时、下载和解压代码包,这个过程增加了首次响应的延迟,称为冷启动。
冷启动时间受运行时类型和代码包体积影响。Python 和 Node.js 的冷启动通常在 200ms 以内;Java 的冷启动因为 JVM 启动时间较长,可能达到数秒;使用容器镜像的函数冷启动时间取决于镜像大小,镜像越大冷启动越慢。
预留实例是彻底消除冷启动的方式。预留实例是持续保持运行的 FC 实例,不管有没有请求,指定数量的实例始终在线,新请求到来时直接调用已经热启动的实例,完全没有冷启动延迟。代价是即使没有请求,预留实例也持续计费,适合对延迟敏感的在线服务。
# 通过 CLI 设置预留实例数量
aliyun fc PutProvisionConfig \
–functionName my-api \
–qualifier LATEST \
–target 2
减少冷启动影响的代码层面优化: 将数据库连接、SDK 客户端初始化等耗时操作放在函数入口(handler)之外,利用 FC 的执行环境复用特性,让这些初始化只在实例第一次启动时执行,后续请求复用已有连接,减少每次调用的实际执行时间:
import pymysql
import os
# 在 handler 外初始化,实例复用时不重复执行
db_connection = pymysql.connect(
host=os.environ.get(‘DB_HOST’),
user=os.environ.get(‘DB_USER’),
password=os.environ.get(‘DB_PASSWORD’),
database=os.environ.get(‘DB_NAME’)
)
def handler(event, context):
# 直接使用已初始化的连接,不需要每次重新连接
cursor = db_connection.cursor()
cursor.execute(‘SELECT COUNT(*) FROM users’)
count = cursor.fetchone()[0]
return {‘user_count’: count}
计费方式
FC 3.0 采用 CU(Compute Unit,计算单元)作为统一计费单位,按实际消耗的 CPU 和内存资源计算 CU 用量,按 CU 数量和执行时间综合计费。
永久免费额度(每月):
- 请求次数:前 800 万次请求免费
- vCPU:前 50 万 vCPU-秒免费
- 内存:前 200 万 GB-秒免费
- GPU:前 100 万 GB-秒免费
对于调用频率不高的函数,每月免费额度通常足够覆盖基础使用量,不会产生任何计费。
超出免费额度后的阶梯计费: FC 3.0 引入阶梯计费,用量越多单价越低。GPU 实例在 FC 3.0 中最高降价幅度达 93%,使用 FC 运行 AI 推理任务的成本相比早期版本大幅下降,包括新增的 Blackwell.1 系列(搭载 NVIDIA B200)实例。
预留实例的计费方式不同: 按需(弹性)实例只在有请求时计费;预留实例无论是否有请求都持续计费,计费单位同样是 CU,但空闲状态下的 CU 单价低于执行状态,以此补偿持续保留实例的成本。
FC vs ECS:选型判断
这是很多团队在部署后端服务时的核心判断。两者不是谁替代谁的关系,适合不同类型的工作负载。
选 FC 的场景:
事件驱动的处理逻辑——用户上传文件触发处理、消息队列消息到达触发消费、定时任务周期执行——这些场景天然适合 FC,事件来时运行,事件结束后缩容到零,不为空闲付费。
流量不均衡的 API——如果 API 在工作时间有流量,夜间几乎没有,FC 只为有请求的时段付费,成本远低于 ECS 全天运行。
微服务中的无状态函数——每次请求独立处理、不依赖上下文状态的函数,是 FC 最理想的场景。
选 ECS 的场景:
持续运行的服务——数据库(不能每次请求都重新连接)、消息队列消费者(需要长连接)、WebSocket 服务(需要维持持久连接),这些都需要常驻运行,ECS 更合适。
有状态的工作负载——在内存中维护会话状态、缓存大量数据的服务,FC 的实例随时可能被回收,状态不能依赖内存长期保存。
持续高并发场景——如果每秒有大量持续请求,FC 的按次计费成本可能超过 ECS 的固定成本,此时 ECS 更经济。
关于 ECS 实例的规格选型和部署配置,可以参考 阿里云 ECS 完整教程。
账号开通与代理充值
使用函数计算 FC 需要有效的阿里云国际版账号,新账号可以申请 3 个月的免费试用额度(每月 15 万 CU)。通过 阿里云账号出售 渠道获取的高权重账号,可以直接用于生产环境的 FC 函数部署,1 分钟交付,免实名免绑卡。
对于 AI 推理或大量函数调用月均消耗在 $200 以上的团队,通过 阿里云国际合作伙伴 充值可以获得赠金返点($100 到账 $110,$500 到账 $600,$1000 到账 $1250),赠金适用于函数计算的所有计费项,付款支持 USDT 和对公转账,年度实际成本明显低于官网直充。


