架构风格与模式58 条

Serverless 与函数计算

以事件触发的函数为部署单元,平台负责伸缩与计费;适合突发流量、胶水集成与低频任务,需接受冷启动、执行时长限制与状态外置。

Serverless 与函数计算

函数计算以事件触发的函数为部署单元,平台负责伸缩与计费,开发者只交付代码。它适合突发流量、胶水集成与低频任务,前提是接受冷启动延迟、执行时长限制,以及必须把状态全部外置到对象存储、数据库或缓存中。

什么时候不该用

长时程批处理、长连接服务、依赖本地状态或本地文件的工作负载都不适合直接放进函数。另一个常见陷阱是函数直连数据库:突发流量下每个实例各占一条连接,很快打满数据库连接上限,需要通过连接池代理或缓存层收敛。

基本信息

伸缩按请求自动伸缩,无需容量规划
限制执行时长、内存、并发配额与冷启动延迟
状态无状态,状态放对象存储、数据库或缓存
计费请求次数、执行时长与出网流量分别计费

适用与规避

  • 适合:事件驱动胶水、突发流量接口、低频定时任务
  • 不适合:长时程批处理、长连接、依赖本地状态的服务
  • 冷启动缓解:预留并发、精简依赖包、优化初始化路径
  • 状态外置:中间结果放对象存储,会话放外部缓存
  • 连接收敛:函数经连接池代理访问数据库,避免连接数打满
  • 本地调试:SAM CLI、Functions Framework、Functions Core Tools 等模拟器

冷启动为什么重要

函数实例在闲置后被回收,下一次调用需要重新拉起运行环境并初始化依赖。这个过程在简单运行时可能只有几十毫秒,但依赖较多的运行时加上框架初始化会达到数百毫秒甚至更长。对延迟敏感的接口,常用做法是预留并发让实例常驻,或者把初始化工作从处理逻辑中剥离,只保留必要的执行路径。

成本与治理

  • 按请求次数与执行时长计费,空转不花钱,但高频小函数的总成本可能高于常驻服务
  • 并发配额是硬上限,突发流量到顶后请求会被拒绝或排队
  • 版本与别名配合灰度发布,回滚时把别名切回之前的版本
  • 函数权限按最小原则授予,避免一个函数持有全量云资源权限
函数之间的同步调用链过长会放大冷启动与超时风险;函数适合短小、边界清晰的任务,把编排交给专门的工作流服务。

易错点

  • 把长时间运行的批处理放进函数,触发执行时长超时与配额封顶
  • 函数直连数据库导致连接数在突发流量时打满,拖垮整个数据库
  • 依赖包体积过大,冷启动从毫秒级上升到秒级,直接影响接口响应
  • 用函数互相同步调用串成长链,任一环节超时都会导致整链失败

数据来源与参考

  • AWS Lambda 官方文档
  • Azure Functions 官方文档
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌