想象你开了一家餐厅,但不需要买厨房:灶台、锅铲、水电、洗碗工都有人替你打理,你只需要把菜谱写好,客人下单时后厨就按菜谱现炒。这个“云食堂”就是 Serverless,而你的菜谱就是函数即服务(FaaS),那些中央厨房里的半成品、腌料、餐具租赁、收银台就是后端即服务(BaaS)。传统模式是你为了偶尔请客,硬要买下整个厨房并养一群厨师,不管有没有客人,厨房都在烧钱;Serverless 模式则完全按订单开火,客人少就少开灶,客人多就自动加灶。本文会用这个“云食堂”的故事,带你理解 Serverless 的架构演变、FaaS 与 BaaS 的分工、计费逻辑、适用场景,以及如何把传统架构一步步迁移到“云端食堂”。
对 AI 从业者而言,理解 Serverless 能让你用更低的运维成本部署和扩展模型服务,把精力从服务器管理转移到算法与业务逻辑上。
目录
可视化演示
本节配有交互动效(进入视口后自动加载,约 3KB)。
架构演变:从自建厨房到云食堂
很多人第一次听到"Serverless"都以为云上真没有服务器,就像以为食堂完全不设后厨。其实,食堂仍然有后厨,只是你不需要自己买灶台、雇厨师、备食材。传统模式是为了偶尔请客,在家里装修一整个厨房:买冰箱、装煤气、屯菜、洗碗,无论有没有客人,这些成本都要承担。Serverless 模式则把厨房外包给一家云食堂,你只负责把菜谱写好,剩下的备菜、炒菜、洗碗都由后厨接管。
从物理机到虚拟机、再到容器和函数,云计算的抽象层一层层抬高。到了 Serverless 这一层,服务器、操作系统、运行时环境、扩缩容逻辑全部从开发者的视野里被抹掉。你看到的只剩“函数”和“后端服务”两种单元。Serverless 并不是一项单一技术,而是 FaaS 与 BaaS 的组合:FaaS 负责承载业务逻辑,BaaS 负责提供数据库、认证、存储等通用后端能力。
回到食堂比喻:Serverless 仍然有“后厨”,只是由云厂商统一管理和维护。你不需要关心厨师几点上班、灶台够不够用,只需要把菜谱写好、把半成品调料备齐。理解这一点,是进入 Serverless 世界的第一把钥匙。
- FaaS函数即服务,把业务逻辑写成函数,交给平台按事件执行。
- BaaS后端即服务,把认证、存储、消息队列等能力封装成 API 直接调用。
- 相加两者叠加才构成完整 Serverless 应用,FaaS 负责前端业务逻辑,BaaS 负责后端基础设施能力。
架构特征:食堂自动加灶
云食堂和传统包厨最大的区别,是它会根据客人数量自动调整灶口。中午 12 点订单暴增,食堂立刻多开十个灶口;下午三点没有客人,灶口自动熄灭,不再消耗燃气。Serverless 架构的核心特征正是这种“事件驱动、自动扩缩、无状态、全托管”的模式。
事件驱动是 Serverless 的引擎。HTTP 请求、消息队列、对象存储上传、定时器触发,都可能成为“客人按铃”的事件源。平台收到事件后,会启动一个函数实例处理;处理完,实例进入休眠或直接被回收。因为函数实例不保存会话状态,平台可以随时创建或销毁它,所以弹性伸缩可以做到近乎实时。
在这个模型里,开发者不需要提前购买“灶台”。平台观测到等待队列变长,就自动加开实例;请求减少,就自动回收。正因如此,Serverless 特别适合流量像潮水一样忽高忽低的业务,比如电商大促、AI 模型突发推理、物联网数据上报等。
- R_req每秒进入系统的请求数,好比同时排队的客人数量。
- Capacity单个函数实例的并发承载能力,好比一个灶口同时能炒的菜品份数。
- N_inst平台自动计算出的实例数量,向上取整保证请求不会溢出。
FaaS核心:订单到达才开火
FaaS 可以理解为一本“菜谱集”。每个函数就是一道菜谱,菜谱里写清楚原料和做法;顾客按铃下单,后厨才打开灶台。经典菜谱(函数)需要短小、单一、可复用,比如“生成缩略图”“解析 OCR 文本”“检查用户权限”。
函数不是一直运行的进程,而是被事件“唤醒”的临时任务。传统服务器上的应用是一个常驻服务,请求来了就处理;FaaS 则是“平时不占资源,事件来了才创建实例”。这个机制带来一个常见问题——冷启动。当新实例第一次被创建时,平台需要加载运行时、初始化环境,这段时间就是冷启动延迟。
所以,FaaS 适合延迟容忍度较高的任务:异步图片处理、消息通知、数据清洗、定时报表等。对实时性要求极高、又无法接受冷启动的核心链路,则需要额外手段,比如预留实例或保持实例常热。就像食堂必须对“订单高峰”提前预热几个灶口,才能避免客人等太久。
- T_cold冷启动时间,好比新灶口第一次点火、热锅、放油的时间。
- T_exec函数代码真正跑业务逻辑的时间,好比食材下锅翻炒的时间。
- T_resp从触发事件到返回结果的完整耗时,是用户感知的响应时间。
BaaS服务:中央厨房的半成品
有了菜谱(FaaS),还必须有调料和食材。BaaS 就是中央厨房里准备好的半成品:腌制好的肉类、切好的蔬菜、现成的酱料、可租赁的桌椅。开发者不需要自己做酸奶、搭冷库、雇收银员,直接通过 API 调用这些现成的后端服务。
典型的 BaaS 服务包括:用户认证与权限管理、云数据库、对象存储、消息队列、短信邮件、第三方支付接口等。在传统架构中,这些组件需要开发、部署、扩容、监控;在 Serverless 架构中,它们变成“开箱即用”的托管服务。FaaS 负责编排业务逻辑,BaaS 负责提供能力底座,两者像“菜谱 + 中央厨房”一样协同工作。
BaaS 不是“免费的午餐”,而是“按用量付费的半成品”。你不需要在厨房里自己做酱料,但每用一勺酱料都要计费。对 AI 服务来说,对象存储放模型文件、消息队列接收推理请求、数据库保存预测结果,这些 BaaS 组件能把后端绑定成本降到最低。
- FaaS(code)开发者只维护函数代码,运行环境由平台托管。
- BaaS(services)数据库、认证、存储等后端能力通过 API 直接使用。
- App两者组合后,开发者无需运维服务器也能得到完整应用。
计费模型:按份收费的食堂
传统服务器的计费像“包场费”:不管有没有客人,只要包下这个场地,就要按天付钱。Serverless 的计费更像“按份收费”:客人点一份菜,就收一份菜的钱;没人点菜,后厨虽然存在,但你不付费。这个特性让低流量、突发流量的成本结构变得非常友好。
FaaS 的账单通常由三个因素决定:函数被调用的次数、单次执行的时长、为函数分配的内存或 CPU 配置。为了便于计费,平台会把执行时长按固定粒度切分,例如每 100 毫秒为一个计费单位,不足 100 毫秒也按 100 毫秒计算。不同云厂商还有免费额度,个人项目甚至可以维持在零成本。
计费模型决定了 Serverless 的适用边界:闲置免费的诱惑很大,但如果业务 24 小时持续高负载,按调用和时长付费可能会比包一台服务器更贵。就像食堂按份收费,对偶尔来吃的散客很划算,对一日三餐都在食堂吃的老客户,可能包月更便宜。
- N_req函数被触发执行的次数,相当于客人的点菜次数。
- ceil(T/100)执行时长按 100 毫秒向上取整得到计费单位数,不足一口也按一口算。
- P_unit每个计费单位的单价,由内存配置等因素决定。
适用场景:快闪夜市与长流水席
什么时候适合租摊位,什么时候适合自己开店?这个选择同样适用于 Serverless。最适合 Serverless 的场景是“快闪夜市”:流量来得快、消失也快,突然有大批人涌来,又突然冷清。比如限时秒杀、新闻热点抓取、节假日营销活动、AI 模型突发推理请求,这些都是典型的高弹性场景。
另一类高频应用是定时任务和异步处理。定时任务往往一天只跑几次,不需要为它常驻一台服务器;异步任务对延迟不敏感,冷启动带来的影响很小。数据清洗、图片转码、视频切片、消息分发,这些“吃完就走的菜”非常适合用 FaaS 来做。反过来,如果业务是“24 小时流水席”——比如核心交易数据库、长连接网关、实时音视频流服务,就不适合后端函数化,因为平台对单次运行时长有限制,也无法保证极低延迟。
快闪夜市摊主不需要常年租大厨房,按订单备菜反而最省钱;长流水席则需要稳定的大厨房,包场更划算。选型时先算算自己的“突发倍数”,比盲目追新更重要。
- R_peak业务最高峰时的请求量,比如大促瞬间涌入的订单。
- R_avg日常平均请求量,比如平时每小时只有几个请求。
- BurstRatio突发倍数,比值远大于 1 时,Serverless 的弹性收益最明显。
选型迁移:大锅菜改小份菜单
从传统架构迁移到 Serverless,就像把一家经营多年的“大锅菜餐厅”改造成“小份菜单店”。原来的大锅是一次性炒一百人份;现在每一道菜要能独立点单、独立制作。迁移不是简单地把代码丢进函数,而是一场结构性改造。
首先要评估现状:业务是否具有突发性?对延迟的容忍度有多高?团队是否熟悉云端 API 编程?如果答案是“流量平稳、延迟敏感、团队没有云原生化经验”,那就不必强行迁移。其次,把单体应用拆成多个函数,按“单一职责”划分:登录认证一个函数、生成报表一个函数、处理图片一个函数。拆分后,还要把共享状态外置到 BaaS,例如使用 Redis、数据库、对象存储,因为函数实例本身不保存状态。
迁移的最后一步是建设可观测性。传统应用有完整日志和监控告警,函数化之后实例是临时且分散的,必须通过分布式追踪、结构化日志、调用链分析来掌握系统状态。就像小份菜餐厅需要更精细的订餐系统,才能知道哪道菜卖得好、哪个厨师效率高。
- C_saved迁移后节省的服务器采购、闲置资源、运维人力成本。
- C_refactor代码拆分、状态外置、监控重建产生的改造代价。
- Benefit只有收益大于零,迁移才值得推进。
AI 应用场景
场景1:AI 图片服务的弹性缩略图管道
阶段:数据预处理与推理后处理
解决的问题:用户上传图片后需要生成多种尺寸缩略图,传统服务器即使没有上传流量也必须常驻等待,造成资源浪费;突发上传时又容易扩容不及时。
具体案例:用户上传图片到对象存储(BaaS),存储桶触发写事件,自动调用 FaaS 函数生成缩略图,再把结果写回另一个存储桶。整个过程无服务器常驻,上传量大时函数实例自动增加。
场景2:大模型 API 网关中的限流与费用统计
阶段:推理服务的访问控制与监控
解决的问题:大模型推理服务需要用户鉴权、请求限流、调用计费统计,传统方式需要部署一个常驻 API 网关,成本高且维护复杂。
具体案例:API 网关接收请求后,FaaS 函数完成 Token 校验和用户配额检查,再调用 BaaS 的数据库服务记录调用次数,最后转发给大模型推理服务。
场景3:夜间自动批量数据清洗与特征工程
阶段:离线数据管道
解决的问题:训练数据每天深夜需要从多个数据源拉取并清洗,传统定时任务需要保持一台服务器全天在线,利用率极低。
具体案例:使用定时触发器每天凌晨调用 FaaS 函数,从消息队列拉取原始日志,调用 BaaS 数据库做特征存储,完成后自动发送通知。数据规模增大时函数自动并发,无需人工扩机器。
Python 演示
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())
class FaaSPlatform:模拟 Serverless 平台,内部维护函数字典和计费累计量。self.functions[name] = duration_ms注册函数,相当于把菜谱放到食堂菜单上。platform.invoke("thumbnail")模拟一次事件触发,相当于顾客点了这道菜。self.baas.call("auth", name)函数执行时调用 BaaS 服务,相当于后厨向中央厨房领半成品。platform.calculate_cost()按调用次数和时长估算费用,对应“按份收费”模型。
常见误区
误区我以为 Serverless 就像名字暗示的那样,云上真的没有物理服务器,代码能凭空飞起来。
正解Serverless 仍然是跑在物理服务器上的,只是服务器被云厂商隐藏了。我们不需要关心它,但它的确存在。就像云食堂一定有后厨、有灶台,只是你不必自己去买和修。
为何常见:这个误区主要来自“无服务器”这个字面翻译,误导性太强,初学者很容易望文生义。
误区我觉得 FaaS 和 BaaS 都是 Serverless,名字不同而已,可以互相替代。
正解它们分工完全不同。FaaS 是“菜谱”,负责执行你的业务代码;BaaS 是“中央厨房的半成品”,提供数据库、认证、存储等现成服务。两者组合才构成完整的 Serverless 应用。
为何常见:因为两者经常在云厂商的同一张宣传页里出现,初学者容易把概念混为一谈。
误区函数第一次被调用时不就是多加载几毫秒吗?对用户应该没什么影响。
正解冷启动可能是几百毫秒甚至几秒,具体取决于运行时、依赖包大小和平台初始化逻辑。对于对延迟敏感的接口,这是必须认真对待的问题。
为何常见:本地调试时函数通常是热实例,速度很快,我们很难体会到线上冷启动的真实代价。
误区既然按量计费、空闲免费,那 Serverless 一定全场景最省钱。
正解只有流量低、波动大、周期短的任务才划算。如果业务 24 小时持续高负载,按调用次数和时长计费可能比包一台长期运行的服务器更贵。
为何常见:大家往往只看到“闲置免费”的广告语,忽略了高负载时的单价累积。
面试题
Q1. Serverless 中“无服务器”的真实含义是?
- A.不需要任何物理硬件
- B.无需关注服务器运维← 正确答案
- C.云厂商不提供服务器
- D.只能运行无状态代码
答案:B。Serverless 仍然运行在服务器上,只是服务器由云厂商管理,开发者无需关注。A 和 C 都误解了“无”的含义;D 是 Serverless 的一种常见特性,但不是命名由来。就像云食堂一定有厨房,只是你不必自己管厨房。
Q2. FaaS 的核心交付单元是?
- A.虚拟机镜像
- B.容器实例
- C.函数代码← 正确答案
- D.API网关
答案:C。FaaS 即函数即服务,最小的部署和计费单元是函数。虚拟机镜像属于 IaaS,容器实例属于容器服务,API 网关是流量入口而非交付单元。函数就像一道菜的菜谱,而不是整套后厨设备。
Q3. BaaS 主要用于提供什么?
- A.后端功能服务← 正确答案
- B.前端界面框架
- C.硬件运维服务
- D.数据备份工具
答案:A。BaaS 提供数据库、认证、存储、消息队列等后端组件,开发者通过 API 直接使用。前端框架属于客户端技术;硬件运维被 Serverless 抽象掉,不是 BaaS 的交付物;数据备份只是 BaaS 的众多能力之一。
Q4. 以下哪个因素通常不会直接决定 FaaS 费用?
- A.函数执行次数
- B.单次运行时长
- C.请求并发峰值← 正确答案
- D.配置的内存大小
答案:C。FaaS 账单通常由调用次数、执行时长、内存配置共同决定。并发峰值本身不单独计费,但它会影响实际产生的调用次数和资源量。就像食堂按菜品份数收费,同时来 100 个客人不会额外收“排队费”,但会炒更多菜。
Q5. 冷启动(cold start)主要发生在什么时候?
- A.函数持续执行时
- B.事件首次触发新实例时← 正确答案
- C.数据库查询完成时
- D.用户浏览器缓存时
答案:B。当事件到达但没有可用热实例时,平台需要新建函数实例并初始化运行时,这段时间就是冷启动。函数持续执行时实例已经存在,不会冷启动;数据库查询和浏览器缓存与函数实例的冷启动无关。
Q6. 下列场景最适合使用 Serverless 的是?
- A.超长实时音视频流
- B.低频定时数据处理← 正确答案
- C.高频固定负载数据库
- D.本地桌面GUI应用
答案:B。低频定时任务调用次数少、闲置时间长,Serverless 可以做到低成本免运维。超长实时流和固定高负载更适合常驻资源;本地桌面应用不依赖云端部署。这就像快闪摊位适合偶尔卖货,不适合当 24 小时超市。
Q7. 关于 FaaS 与 BaaS 的协作,正确的理解是?
- A.FaaS替代BaaS的数据存储能力
- B.FaaS调用BaaS组装后端能力← 正确答案
- C.BaaS依赖FaaS计算才能计费
- D.两者都在用户私有数据中心
答案:B。FaaS 执行业务逻辑时通过 API 调用 BaaS 提供的数据、认证、存储等能力,从而组装成完整应用。FaaS 不替代数据存储;BaaS 不是只能依赖 FaaS;两者都运行在云厂商托管的平台上,而非用户私有数据中心。
Q8. 将单体应用迁移到 FaaS 时,关键改造点是?
- A.不断增大服务器内存
- B.把状态外置到后端服务← 正确答案
- C.关闭函数运行日志
- D.删除全部API接口
答案:B。函数实例通常无状态且随时销毁,所以共享状态要放到 BaaS 的数据库、缓存或对象存储中。增大服务器内存不符合 Serverless 理念;关闭日志会破坏可观测性;删除 API 接口会让应用无法被访问。
Q9. 下列哪些事件源适合驱动 Serverless 函数?
- A.对象存储上传事件← 正确答案
- B.定时器触发事件← 正确答案
- C.用户邮件人工回复
- D.消息队列消息到达← 正确答案
答案:ABD。对象上传、定时器、消息队列都是常见的 FaaS 触发器,可以自动调用函数。用户邮件人工回复通常不会直接驱动函数,需要人工介入,不应作为自动化事件源。它们就像点菜单上的不同按铃方式:客人按铃,后厨才炒菜。
Q10. 关于 Serverless 计费和扩缩容说法正确的有?
- A.闲置无调用时通常不产生费用← 正确答案
- B.并发突增时平台可自动扩展实例← 正确答案
- C.执行时间越长对应费用越高← 正确答案
- D.预留资源可以彻底消除冷启动
答案:ABC。Serverless 按调用时长计费,无调用时闲置免费;平台可以自动扩缩容;执行时长越长,计费单位越多。预留资源能够显著减少冷启动,但“彻底消除”过于绝对,代码加载、运行时初始化等因素仍可能带来延迟。