想象你开了一家餐厅,但不需要买厨房:灶台、锅铲、水电、洗碗工都有人替你打理,你只需要把菜谱写好,客人下单时后厨就按菜谱现炒。这个“云食堂”就是 Serverless,而你的菜谱就是函数即服务(FaaS),那些中央厨房里的半成品、腌料、餐具租赁、收银台就是后端即服务(BaaS)。传统模式是你为了偶尔请客,硬要买下整个厨房并养一群厨师,不管有没有客人,厨房都在烧钱;Serverless 模式则完全按订单开火,客人少就少开灶,客人多就自动加灶。本文会用这个“云食堂”的故事,带你理解 Serverless 的架构演变、FaaS 与 BaaS 的分工、计费逻辑、适用场景,以及如何把传统架构一步步迁移到“云端食堂”。

岗位关联

对 AI 从业者而言,理解 Serverless 能让你用更低的运维成本部署和扩展模型服务,把精力从服务器管理转移到算法与业务逻辑上。

目录
  1. 可视化演示
  2. 架构演变:从自建厨房到云食堂
  3. 架构特征:食堂自动加灶
  4. FaaS核心:订单到达才开火
  5. BaaS服务:中央厨房的半成品
  6. 计费模型:按份收费的食堂
  7. 适用场景:快闪夜市与长流水席
  8. 选型迁移:大锅菜改小份菜单
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

本节配有交互动效(进入视口后自动加载,约 3KB)。

架构演变:从自建厨房到云食堂

很多人第一次听到"Serverless"都以为云上真没有服务器,就像以为食堂完全不设后厨。其实,食堂仍然有后厨,只是你不需要自己买灶台、雇厨师、备食材。传统模式是为了偶尔请客,在家里装修一整个厨房:买冰箱、装煤气、屯菜、洗碗,无论有没有客人,这些成本都要承担。Serverless 模式则把厨房外包给一家云食堂,你只负责把菜谱写好,剩下的备菜、炒菜、洗碗都由后厨接管。

从物理机到虚拟机、再到容器和函数,云计算的抽象层一层层抬高。到了 Serverless 这一层,服务器、操作系统、运行时环境、扩缩容逻辑全部从开发者的视野里被抹掉。你看到的只剩“函数”和“后端服务”两种单元。Serverless 并不是一项单一技术,而是 FaaS 与 BaaS 的组合:FaaS 负责承载业务逻辑,BaaS 负责提供数据库、认证、存储等通用后端能力。

回到食堂比喻:Serverless 仍然有“后厨”,只是由云厂商统一管理和维护。你不需要关心厨师几点上班、灶台够不够用,只需要把菜谱写好、把半成品调料备齐。理解这一点,是进入 Serverless 世界的第一把钥匙。

Serverless=FaaS+BaaS\text{Serverless} = \text{FaaS} + \text{BaaS}
公式说明:Serverless 不是“没有服务器”,而是把服务器变成云食堂的后厨,用户只关心“菜单”和“半成品服务”。
  1. FaaS函数即服务,把业务逻辑写成函数,交给平台按事件执行。
    FaaS:event→function\text{FaaS}: \text{event} \rightarrow \text{function}
  2. BaaS后端即服务,把认证、存储、消息队列等能力封装成 API 直接调用。
    BaaS:App→API\text{BaaS}: \text{App} \rightarrow \text{API}
  3. 相加两者叠加才构成完整 Serverless 应用,FaaS 负责前端业务逻辑,BaaS 负责后端基础设施能力。
    Serverless=FaaS+BaaS\text{Serverless} = \text{FaaS} + \text{BaaS}

架构特征:食堂自动加灶

云食堂和传统包厨最大的区别,是它会根据客人数量自动调整灶口。中午 12 点订单暴增,食堂立刻多开十个灶口;下午三点没有客人,灶口自动熄灭,不再消耗燃气。Serverless 架构的核心特征正是这种“事件驱动、自动扩缩、无状态、全托管”的模式。

事件驱动是 Serverless 的引擎。HTTP 请求、消息队列、对象存储上传、定时器触发,都可能成为“客人按铃”的事件源。平台收到事件后,会启动一个函数实例处理;处理完,实例进入休眠或直接被回收。因为函数实例不保存会话状态,平台可以随时创建或销毁它,所以弹性伸缩可以做到近乎实时。

在这个模型里,开发者不需要提前购买“灶台”。平台观测到等待队列变长,就自动加开实例;请求减少,就自动回收。正因如此,Serverless 特别适合流量像潮水一样忽高忽低的业务,比如电商大促、AI 模型突发推理、物联网数据上报等。

Ninst=⌈RreqCapacity⌉N_{\text{inst}} = \left\lceil \dfrac{R_{\text{req}}}{\text{Capacity}} \right\rceil
公式说明:平台会根据请求量和单个实例的处理能力,自动算出需要多少个函数实例,相当于食堂根据客流自动决定开几个灶口。
  1. R_req每秒进入系统的请求数,好比同时排队的客人数量。
    RreqR_{\text{req}}
  2. Capacity单个函数实例的并发承载能力,好比一个灶口同时能炒的菜品份数。
    Capacity\text{Capacity}
  3. N_inst平台自动计算出的实例数量,向上取整保证请求不会溢出。
    Ninst=⌈RreqCapacity⌉N_{\text{inst}} = \left\lceil \dfrac{R_{\text{req}}}{\text{Capacity}} \right\rceil

FaaS核心:订单到达才开火

FaaS 可以理解为一本“菜谱集”。每个函数就是一道菜谱,菜谱里写清楚原料和做法;顾客按铃下单,后厨才打开灶台。经典菜谱(函数)需要短小、单一、可复用,比如“生成缩略图”“解析 OCR 文本”“检查用户权限”。

函数不是一直运行的进程,而是被事件“唤醒”的临时任务。传统服务器上的应用是一个常驻服务,请求来了就处理;FaaS 则是“平时不占资源,事件来了才创建实例”。这个机制带来一个常见问题——冷启动。当新实例第一次被创建时,平台需要加载运行时、初始化环境,这段时间就是冷启动延迟。

所以,FaaS 适合延迟容忍度较高的任务:异步图片处理、消息通知、数据清洗、定时报表等。对实时性要求极高、又无法接受冷启动的核心链路,则需要额外手段,比如预留实例或保持实例常热。就像食堂必须对“订单高峰”提前预热几个灶口,才能避免客人等太久。

Tresp=Tcold+TexecT_{\text{resp}} = T_{\text{cold}} + T_{\text{exec}}
公式说明:一次函数调用的总响应时间,等于冷启动时间加上真正的业务执行时间。
  1. T_cold冷启动时间,好比新灶口第一次点火、热锅、放油的时间。
    TcoldT_{\text{cold}}
  2. T_exec函数代码真正跑业务逻辑的时间,好比食材下锅翻炒的时间。
    TexecT_{\text{exec}}
  3. T_resp从触发事件到返回结果的完整耗时,是用户感知的响应时间。
    Tresp=Tcold+TexecT_{\text{resp}} = T_{\text{cold}} + T_{\text{exec}}

BaaS服务:中央厨房的半成品

有了菜谱(FaaS),还必须有调料和食材。BaaS 就是中央厨房里准备好的半成品:腌制好的肉类、切好的蔬菜、现成的酱料、可租赁的桌椅。开发者不需要自己做酸奶、搭冷库、雇收银员,直接通过 API 调用这些现成的后端服务。

典型的 BaaS 服务包括:用户认证与权限管理、云数据库、对象存储、消息队列、短信邮件、第三方支付接口等。在传统架构中,这些组件需要开发、部署、扩容、监控;在 Serverless 架构中,它们变成“开箱即用”的托管服务。FaaS 负责编排业务逻辑,BaaS 负责提供能力底座,两者像“菜谱 + 中央厨房”一样协同工作。

BaaS 不是“免费的午餐”,而是“按用量付费的半成品”。你不需要在厨房里自己做酱料,但每用一勺酱料都要计费。对 AI 服务来说,对象存储放模型文件、消息队列接收推理请求、数据库保存预测结果,这些 BaaS 组件能把后端绑定成本降到最低。

App=FaaS(code)+BaaS(services)\text{App} = \text{FaaS}(\text{code}) + \text{BaaS}(\text{services})
公式说明:一个完整应用由用户自己写的函数业务逻辑,与云厂商提供的托管后端服务共同构成。
  1. FaaS(code)开发者只维护函数代码,运行环境由平台托管。
    FaaS(code)\text{FaaS}(\text{code})
  2. BaaS(services)数据库、认证、存储等后端能力通过 API 直接使用。
    BaaS(services)\text{BaaS}(\text{services})
  3. App两者组合后,开发者无需运维服务器也能得到完整应用。
    App=FaaS(code)+BaaS(services)\text{App} = \text{FaaS}(\text{code}) + \text{BaaS}(\text{services})

计费模型:按份收费的食堂

传统服务器的计费像“包场费”:不管有没有客人,只要包下这个场地,就要按天付钱。Serverless 的计费更像“按份收费”:客人点一份菜,就收一份菜的钱;没人点菜,后厨虽然存在,但你不付费。这个特性让低流量、突发流量的成本结构变得非常友好。

FaaS 的账单通常由三个因素决定:函数被调用的次数、单次执行的时长、为函数分配的内存或 CPU 配置。为了便于计费,平台会把执行时长按固定粒度切分,例如每 100 毫秒为一个计费单位,不足 100 毫秒也按 100 毫秒计算。不同云厂商还有免费额度,个人项目甚至可以维持在零成本。

计费模型决定了 Serverless 的适用边界:闲置免费的诱惑很大,但如果业务 24 小时持续高负载,按调用和时长付费可能会比包一台服务器更贵。就像食堂按份收费,对偶尔来吃的散客很划算,对一日三餐都在食堂吃的老客户,可能包月更便宜。

Cost=Nreq×⌈Texec100⌉×Punit\text{Cost} = N_{\text{req}} \times \left\lceil \dfrac{T_{\text{exec}}}{100} \right\rceil \times P_{\text{unit}}
公式说明:这是简化后的 FaaS 费用公式,表示总费用等于调用次数、计费单位数、单价的乘积。
  1. N_req函数被触发执行的次数,相当于客人的点菜次数。
    NreqN_{\text{req}}
  2. ceil(T/100)执行时长按 100 毫秒向上取整得到计费单位数,不足一口也按一口算。
    ⌈Texec100⌉\left\lceil \dfrac{T_{\text{exec}}}{100} \right\rceil
  3. P_unit每个计费单位的单价,由内存配置等因素决定。
    PunitP_{\text{unit}}

适用场景:快闪夜市与长流水席

什么时候适合租摊位,什么时候适合自己开店?这个选择同样适用于 Serverless。最适合 Serverless 的场景是“快闪夜市”:流量来得快、消失也快,突然有大批人涌来,又突然冷清。比如限时秒杀、新闻热点抓取、节假日营销活动、AI 模型突发推理请求,这些都是典型的高弹性场景。

另一类高频应用是定时任务和异步处理。定时任务往往一天只跑几次,不需要为它常驻一台服务器;异步任务对延迟不敏感,冷启动带来的影响很小。数据清洗、图片转码、视频切片、消息分发,这些“吃完就走的菜”非常适合用 FaaS 来做。反过来,如果业务是“24 小时流水席”——比如核心交易数据库、长连接网关、实时音视频流服务,就不适合后端函数化,因为平台对单次运行时长有限制,也无法保证极低延迟。

快闪夜市摊主不需要常年租大厨房,按订单备菜反而最省钱;长流水席则需要稳定的大厨房,包场更划算。选型时先算算自己的“突发倍数”,比盲目追新更重要。

BurstRatio=RpeakRavg\text{BurstRatio} = \dfrac{R_{\text{peak}}}{R_{\text{avg}}}
公式说明:用峰值请求量与平均请求量之比衡量“突发程度”,比值越大,越适合 Serverless。
  1. R_peak业务最高峰时的请求量,比如大促瞬间涌入的订单。
    RpeakR_{\text{peak}}
  2. R_avg日常平均请求量,比如平时每小时只有几个请求。
    RavgR_{\text{avg}}
  3. BurstRatio突发倍数,比值远大于 1 时,Serverless 的弹性收益最明显。
    BurstRatio=RpeakRavg\text{BurstRatio} = \dfrac{R_{\text{peak}}}{R_{\text{avg}}}

选型迁移:大锅菜改小份菜单

从传统架构迁移到 Serverless,就像把一家经营多年的“大锅菜餐厅”改造成“小份菜单店”。原来的大锅是一次性炒一百人份;现在每一道菜要能独立点单、独立制作。迁移不是简单地把代码丢进函数,而是一场结构性改造。

首先要评估现状:业务是否具有突发性?对延迟的容忍度有多高?团队是否熟悉云端 API 编程?如果答案是“流量平稳、延迟敏感、团队没有云原生化经验”,那就不必强行迁移。其次,把单体应用拆成多个函数,按“单一职责”划分:登录认证一个函数、生成报表一个函数、处理图片一个函数。拆分后,还要把共享状态外置到 BaaS,例如使用 Redis、数据库、对象存储,因为函数实例本身不保存状态。

迁移的最后一步是建设可观测性。传统应用有完整日志和监控告警,函数化之后实例是临时且分散的,必须通过分布式追踪、结构化日志、调用链分析来掌握系统状态。就像小份菜餐厅需要更精细的订餐系统,才能知道哪道菜卖得好、哪个厨师效率高。

Benefit=Csaved−Crefactor\text{Benefit} = C_{\text{saved}} - C_{\text{refactor}}
公式说明:迁移收益等于省下的运维与资源成本,减去改造代码、学习平台、调整监控等重构成本。
  1. C_saved迁移后节省的服务器采购、闲置资源、运维人力成本。
    CsavedC_{\text{saved}}
  2. C_refactor代码拆分、状态外置、监控重建产生的改造代价。
    CrefactorC_{\text{refactor}}
  3. Benefit只有收益大于零,迁移才值得推进。
    Benefit=Csaved−Crefactor\text{Benefit} = C_{\text{saved}} - C_{\text{refactor}}

AI 应用场景

场景1:AI 图片服务的弹性缩略图管道

阶段:数据预处理与推理后处理

解决的问题:用户上传图片后需要生成多种尺寸缩略图,传统服务器即使没有上传流量也必须常驻等待,造成资源浪费;突发上传时又容易扩容不及时。

具体案例:用户上传图片到对象存储(BaaS),存储桶触发写事件,自动调用 FaaS 函数生成缩略图,再把结果写回另一个存储桶。整个过程无服务器常驻,上传量大时函数实例自动增加。

场景2:大模型 API 网关中的限流与费用统计

阶段:推理服务的访问控制与监控

解决的问题:大模型推理服务需要用户鉴权、请求限流、调用计费统计,传统方式需要部署一个常驻 API 网关,成本高且维护复杂。

具体案例:API 网关接收请求后,FaaS 函数完成 Token 校验和用户配额检查,再调用 BaaS 的数据库服务记录调用次数,最后转发给大模型推理服务。

场景3:夜间自动批量数据清洗与特征工程

阶段:离线数据管道

解决的问题:训练数据每天深夜需要从多个数据源拉取并清洗,传统定时任务需要保持一台服务器全天在线,利用率极低。

具体案例:使用定时触发器每天凌晨调用 FaaS 函数,从消息队列拉取原始日志,调用 BaaS 数据库做特征存储,完成后自动发送通知。数据规模增大时函数自动并发,无需人工扩机器。

Python 演示

python47 行
class Baas:    """BaaS 后端服务模拟器"""     def __init__(self):        self.calls = 0     def call(self, service_name, payload):        self.calls += 1        return "{}:{}".format(service_name, payload)  class FaaSPlatform:    """FaaS 平台: 注册函数, 触发执行, 统计费用"""     def __init__(self, unit_price=0.000002):        self.functions = {}        self.execution_count = 0        self.total_duration_ms = 0        self.unit_price = unit_price        self.baas = Baas()     def register(self, name, duration_ms):        self.functions[name] = duration_ms     def invoke(self, name):        if name not in self.functions:            raise KeyError(name)        self.execution_count += 1        self.total_duration_ms += self.functions[name]        self.baas.call("auth", name)     def calculate_cost(self):        units = self.total_duration_ms // 100 + 1        return self.execution_count * units * self.unit_price  if __name__ == "__main__":    platform = FaaSPlatform()    platform.register("thumbnail", 120)    platform.register("ocr_extract", 300)     for event in ["thumbnail", "ocr_extract", "thumbnail", "ocr_extract", "thumbnail"]:        platform.invoke(event)     print("execution_count =", platform.execution_count)    print("total_duration_ms =", platform.total_duration_ms)    print("estimated_cost =", platform.calculate_cost())
目的:用 Python 模拟一个极简 FaaS 平台,演示函数注册、事件触发、BaaS 调用与按执行时长估算费用的过程。
  1. class FaaSPlatform:模拟 Serverless 平台,内部维护函数字典和计费累计量。
  2. self.functions[name] = duration_ms注册函数,相当于把菜谱放到食堂菜单上。
  3. platform.invoke("thumbnail")模拟一次事件触发,相当于顾客点了这道菜。
  4. self.baas.call("auth", name)函数执行时调用 BaaS 服务,相当于后厨向中央厨房领半成品。
  5. platform.calculate_cost()按调用次数和时长估算费用,对应“按份收费”模型。

常见误区

误区我以为 Serverless 就像名字暗示的那样,云上真的没有物理服务器,代码能凭空飞起来。

正解Serverless 仍然是跑在物理服务器上的,只是服务器被云厂商隐藏了。我们不需要关心它,但它的确存在。就像云食堂一定有后厨、有灶台,只是你不必自己去买和修。

为何常见:这个误区主要来自“无服务器”这个字面翻译,误导性太强,初学者很容易望文生义。

误区我觉得 FaaS 和 BaaS 都是 Serverless,名字不同而已,可以互相替代。

正解它们分工完全不同。FaaS 是“菜谱”,负责执行你的业务代码;BaaS 是“中央厨房的半成品”,提供数据库、认证、存储等现成服务。两者组合才构成完整的 Serverless 应用。

为何常见:因为两者经常在云厂商的同一张宣传页里出现,初学者容易把概念混为一谈。

误区函数第一次被调用时不就是多加载几毫秒吗?对用户应该没什么影响。

正解冷启动可能是几百毫秒甚至几秒,具体取决于运行时、依赖包大小和平台初始化逻辑。对于对延迟敏感的接口,这是必须认真对待的问题。

为何常见:本地调试时函数通常是热实例,速度很快,我们很难体会到线上冷启动的真实代价。

误区既然按量计费、空闲免费,那 Serverless 一定全场景最省钱。

正解只有流量低、波动大、周期短的任务才划算。如果业务 24 小时持续高负载,按调用次数和时长计费可能比包一台长期运行的服务器更贵。

为何常见:大家往往只看到“闲置免费”的广告语,忽略了高负载时的单价累积。

面试题

Q1. Serverless 中“无服务器”的真实含义是?

单选题 · easy

  • A.不需要任何物理硬件
  • B.无需关注服务器运维← 正确答案
  • C.云厂商不提供服务器
  • D.只能运行无状态代码

答案:B。Serverless 仍然运行在服务器上,只是服务器由云厂商管理,开发者无需关注。A 和 C 都误解了“无”的含义;D 是 Serverless 的一种常见特性,但不是命名由来。就像云食堂一定有厨房,只是你不必自己管厨房。

Q2. FaaS 的核心交付单元是?

单选题 · easy

  • A.虚拟机镜像
  • B.容器实例
  • C.函数代码← 正确答案
  • D.API网关

答案:C。FaaS 即函数即服务,最小的部署和计费单元是函数。虚拟机镜像属于 IaaS,容器实例属于容器服务,API 网关是流量入口而非交付单元。函数就像一道菜的菜谱,而不是整套后厨设备。

Q3. BaaS 主要用于提供什么?

单选题 · easy

  • A.后端功能服务← 正确答案
  • B.前端界面框架
  • C.硬件运维服务
  • D.数据备份工具

答案:A。BaaS 提供数据库、认证、存储、消息队列等后端组件,开发者通过 API 直接使用。前端框架属于客户端技术;硬件运维被 Serverless 抽象掉,不是 BaaS 的交付物;数据备份只是 BaaS 的众多能力之一。

Q4. 以下哪个因素通常不会直接决定 FaaS 费用?

单选题 · mid

  • A.函数执行次数
  • B.单次运行时长
  • C.请求并发峰值← 正确答案
  • D.配置的内存大小

答案:C。FaaS 账单通常由调用次数、执行时长、内存配置共同决定。并发峰值本身不单独计费,但它会影响实际产生的调用次数和资源量。就像食堂按菜品份数收费,同时来 100 个客人不会额外收“排队费”,但会炒更多菜。

Q5. 冷启动(cold start)主要发生在什么时候?

单选题 · mid

  • A.函数持续执行时
  • B.事件首次触发新实例时← 正确答案
  • C.数据库查询完成时
  • D.用户浏览器缓存时

答案:B。当事件到达但没有可用热实例时,平台需要新建函数实例并初始化运行时,这段时间就是冷启动。函数持续执行时实例已经存在,不会冷启动;数据库查询和浏览器缓存与函数实例的冷启动无关。

Q6. 下列场景最适合使用 Serverless 的是?

单选题 · mid

  • A.超长实时音视频流
  • B.低频定时数据处理← 正确答案
  • C.高频固定负载数据库
  • D.本地桌面GUI应用

答案:B。低频定时任务调用次数少、闲置时间长,Serverless 可以做到低成本免运维。超长实时流和固定高负载更适合常驻资源;本地桌面应用不依赖云端部署。这就像快闪摊位适合偶尔卖货,不适合当 24 小时超市。

Q7. 关于 FaaS 与 BaaS 的协作,正确的理解是?

单选题 · hard

  • A.FaaS替代BaaS的数据存储能力
  • B.FaaS调用BaaS组装后端能力← 正确答案
  • C.BaaS依赖FaaS计算才能计费
  • D.两者都在用户私有数据中心

答案:B。FaaS 执行业务逻辑时通过 API 调用 BaaS 提供的数据、认证、存储等能力,从而组装成完整应用。FaaS 不替代数据存储;BaaS 不是只能依赖 FaaS;两者都运行在云厂商托管的平台上,而非用户私有数据中心。

Q8. 将单体应用迁移到 FaaS 时,关键改造点是?

单选题 · hard

  • A.不断增大服务器内存
  • B.把状态外置到后端服务← 正确答案
  • C.关闭函数运行日志
  • D.删除全部API接口

答案:B。函数实例通常无状态且随时销毁,所以共享状态要放到 BaaS 的数据库、缓存或对象存储中。增大服务器内存不符合 Serverless 理念;关闭日志会破坏可观测性;删除 API 接口会让应用无法被访问。

Q9. 下列哪些事件源适合驱动 Serverless 函数?

多选题 · mid

  • A.对象存储上传事件← 正确答案
  • B.定时器触发事件← 正确答案
  • C.用户邮件人工回复
  • D.消息队列消息到达← 正确答案

答案:ABD。对象上传、定时器、消息队列都是常见的 FaaS 触发器,可以自动调用函数。用户邮件人工回复通常不会直接驱动函数,需要人工介入,不应作为自动化事件源。它们就像点菜单上的不同按铃方式:客人按铃,后厨才炒菜。

Q10. 关于 Serverless 计费和扩缩容说法正确的有?

多选题 · extreme

  • A.闲置无调用时通常不产生费用← 正确答案
  • B.并发突增时平台可自动扩展实例← 正确答案
  • C.执行时间越长对应费用越高← 正确答案
  • D.预留资源可以彻底消除冷启动

答案:ABC。Serverless 按调用时长计费,无调用时闲置免费;平台可以自动扩缩容;执行时长越长,计费单位越多。预留资源能够显著减少冷启动,但“彻底消除”过于绝对,代码加载、运行时初始化等因素仍可能带来延迟。