函数计算 FC 实践:千里达票务系统异步任务与临时弹性方案
票务系统里总有一些"突发、短生命周期"的活:节假日凌晨自动对账、退票后短信回调、Excel 批量导票。如果都塞进 ECS 主进程,节假日扩容要多留一堆冗余机器。千里达票务系统把这类任务迁到阿里云函数计算 FC,按调用次数付费,冷启动也在可接受范围。
一、哪些任务适合 Serverless
- 异步回调:支付成功后的短信推送、发票开具,主接口不必等;
- 定时作业:每日凌晨对账、过期订单自动取消、库存回补;
- 突发计算:节前排期报表、Excel 批量导入游客名单;
- Webhook 接收:第三方渠道(OTA、旅行社)的订单推送。
二、方案设计
业务系统 → MQ/API 网关 → 函数计算 FC → 下游(RDS/Redis/短信)
↑
定时触发器(每日02:00对账)
三、关键实现
3.1 Python 函数示例
import json
from aliyunsdkcore.client import AcsClient
from aliyunsdkdysmsapi.request.v20170525 import SendSmsRequest
def handler(event, context):
evt = json.loads(event)
phone = evt.get("mobile")
order_no = evt.get("order_no")
# 调短信服务
req = SendSmsRequest.SendSmsRequest()
req.set_PhoneNumbers(phone)
req.set_TemplateCode("SMS_xxxx")
req.set_TemplateParam(json.dumps({
"order": order_no}))
client = AcsClient()
resp = client.do_action_with_exception(req)
return {
"status": "ok", "resp": resp.decode()}
3.2 触发器配置
- HTTP 触发器:暴露给 OTA 渠道推单,走 API 网关鉴权;
- 定时器触发器:cron
0 0 2 * * *,每日 02:00 跑对账; - OSS 触发器:Excel 游客名单上传到 OSS 自动触发导入。
3.3 冷启动优化
预置实例保留 1 个,节假日把预置数调到 5,避免突发流量下大量冷启动拖慢首单。
四、踩坑复盘
- 执行超时:默认 3 秒,批量导票跑不完。解决:按任务类型调长超时(最长 10 分钟),大任务切片;
- 本地调试不一致:函数里时区默认 UTC,订单时间对不上。解决:代码里显式指定 Asia/Shanghai;
- 权限过大:函数 RAM 角色直接给了管理员,安全风险高。解决:按最小权限,只授 RDS 某库读写、短信发送;
- 冷启动抖动:大依赖包(Pandas)冷启动 5 秒+。解决:精简依赖层、用层(Layer)复用公共依赖。
五、效果与总结
迁到 FC 后,节假日不必为异步任务单独多备 ECS,月度计算成本按调用量结算,账单透明。对千里达票务系统这类波峰明显的业务,Serverless 是主集群之外很好的补充层:主链路用 ECS/ACK 保稳定,边缘异步用 FC 保弹性。