2.4 云函数与托管心得:冷启动、区域与部署节奏
云函数和托管是四大件里的“工程件”:逻辑不难,难的是运行时机、地理位置和发布节奏这些工程细节。这一节讲的都是长期项目中反复验证过的手感。
冷启动:低频函数的第一声咳嗽
云函数是事件驱动的:HTTP 请求能触发、数据库文档变化能触发、定时器也能触发,按调用次数和运行时长计费,具体价格以官方文档为准。听起来很美,但有一个绕不开的物理现实:实例不是常驻的。 一段时间没人调用,实例被回收,下一次调用就要现场拉起环境,这就是冷启动。
低频函数的冷启动最疼——比如每天只跑几次的统计接口,用户每次都可能赶上“第一声咳嗽”,等待明显变长。我的应对经验,按场景分三种:
| 场景 | 处方 | 代价 |
|---|---|---|
| 后台任务、定时统计 | 直接接受冷启动 | 无,晚一秒没人知道 |
| 用户可感知的接口 | 前端加载态兜底,或评估预热 | 体验略降或额外成本 |
| 延迟极度敏感的接口 | 定时触发自我唤醒保活 | 持续成本与额外调用次数 |
保活要权衡:定时唤醒能压住冷启动,但这引入了持续成本和额外调用次数,值不值要看业务对延迟的真实敏感度,别无脑上。
我的总原则:先量化,再优化。 用日志看清函数真实的调用频率和延迟分布,大部分情况下你会发现冷启动没有想象中可怕。
区域选择:一开就定的事
函数区域离谁近很重要。两个原则:
- 函数要离数据库近。 函数和 Firestore 之间每次交互都走网络,跨区域等于每次数据库操作都叠加跨洋延迟,一个函数里循环读写几十次,延迟是灾难性的。函数区域尽量和数据库区域一致。
- 建库区域一开就定。 Firestore 的区域创建后不能改,选区前想清楚用户主力在哪里。函数以后还能换区重部署,数据库搬家几乎等于重做。
区域是典型的“决策成本五分钟,返工成本一个月”的事项,项目立项时就该定下来。
部署节奏:模拟器、低峰、可回滚
部署出过几次事故后,我固化了一套节奏,核心是三句话:
- 先在本地模拟器跑通。 模拟器套件能在本地把函数和数据库整套装起来,部署前跑一遍核心路径,大部分低级错误(拼写错路径、规则没同步)就地拦截。
- 生产部署选低峰期。 函数部署期间存在切换窗口,别在业务高峰动手,深夜或清晨的十几次部署换不来用户的十几次报错。
- 回滚靠版本。 部署出问题别现场救火改代码,回滚到上一个正常版本先止血,再慢慢查。这也是为什么每次部署前要确认上一个版本是可用的。
| 问题 | 原因 | 处方 |
|---|---|---|
| 接口偶尔特别慢 | 低频函数冷启动 | 量化频率后决定接受或预热 |
| 函数里数据库操作慢得离谱 | 函数与数据库跨区域 | 函数区域与数据库区域对齐 |
| 部署后偶发报错 | 部署切换窗口撞上高峰 | 低峰部署,出问题按版本回滚 |
| 前端更新后用户看到旧页面 | 缓存策略一刀切 | 静态资源长缓存,HTML 短缓存 |
Hosting 缓存心得
Hosting 负责静态站点与 CDN,还能配重写规则把某些路径转给云函数,前端路由和 API 能挂在同一个域名下,省掉跨域配置。缓存是 Hosting 的心得重点,一句话口诀:静态资源长缓存,HTML 短缓存。
带哈希指纹的 JS、CSS、图片可以放心配长缓存,内容变了文件名就变;HTML 是入口,缓存久了用户会停留在旧版本上引用已被删除的资源,所以要短缓存或不缓存。配重写规则时留意优先级,路径匹配顺序不对,请求会落到意料之外的后端。
本节小结
云函数与托管的心得都是工程纪律:冷启动先量化再优化,区域跟着数据库走且开库即定,部署走模拟器、低峰、可回滚三步,缓存按资源类型区别对待。这些细节单个都不起眼,合起来决定了项目上线后你是睡觉安稳还是半夜被叫醒。
