什么是无服务器?无服务器计算简单讲解
无服务器是一种运行代码的方式,你无需自己设置或管理任何服务器。你把代码交给云服务商,只有在某件事触发它时才运行,例如一个网页请求、一个上传的文件或一条付款通知,运行结束后便停止。你通常只为代码实际运行的时间付费,而不是为闲置的机器付费。
用 AI 构建时,无服务器为什么重要
当你用 AI 构建应用并查看托管选项或代码时,会遇到“无服务器函数”“边缘函数”或“云函数”之类的说法。许多托管平台都提供这些功能,一些 AI 构建工具也会以这种方式部署后端。理解这种模式,有助于你回答三个实际问题:
- 成本。 没有人使用时,你的应用会不会仍在产生费用?
- 速度。 为什么一段安静时期后的第一次请求会更慢?
- 限制。 为什么某个耗时的任务(例如生成大型报告、处理视频)会超时?
同样有必要知道无服务器不是什么:它并不意味着没有后端。你仍然有服务器端代码,只是由别人来运行那些机器。关于基础知识,可参阅什么是服务器。
日常类比
传统服务器就像自己拥有一辆车。它随时待命,随时可以立即出发,但无论你开不开,你都要为它付费:保险、停车、保养。
无服务器则像叫一辆出租车。你只为实际乘坐的行程付费;如果一百个人同时要打车,就会来一百辆车。但车子可能需要一段等待时间(即冷启动),每次行程都有最长时限,而且司机不会记得你上一次的行程(函数是无状态的)。
无服务器函数如何工作
最常见的形式称为函数即服务(FaaS):
- 你编写一个函数,这是一小段代码,用来处理某一类事件,例如“处理发送到
/api/bookings的 POST 请求”。 - 你部署它。 服务商存储该函数,并把它连接到一个触发器上:一个网址、一个定时任务、存储中新上传的文件,或队列中的一条消息。
- 事件到达。 服务商启动一个函数副本(或复用一个已经预热的副本),运行并返回结果。
- 自动扩容。 如果同时到达一千个请求,服务商会并行运行许多副本,直到达到你账户的限制。
- 进入空闲。 请求停止后,副本会被关闭。没有任何东西在运行时,计算部分就不收费。
一个用 JavaScript 写的小型无服务器函数可能是这样的:
export default async function handler(request) {
const { name } = await request.json();
return Response.json({ message: `Hello, ${name}` });
}
你不需要编写启动服务器、开放端口或保持进程运行的代码。这些都由平台处理。
“无服务器”一词也被更宽泛地用于其他按需扩展、按用量计费的托管服务,例如无服务器数据库,它们在空闲时会自动暂停。
关键术语
| 术语 | 含义 |
|---|---|
| 函数(FaaS) | 服务商按需运行的一小段代码单元。 |
| 触发器 / 事件 | 启动函数的原因:HTTP 请求、文件上传、定时器、队列消息。 |
| 冷启动 | 在处理请求之前,需要先启动一个新的函数副本所产生的延迟。 |
| 预热 | 已经在运行、可以立即响应的副本。 |
| 无状态 | 函数在两次运行之间不保留任何记忆。任何需要持久保存的内容都必须放入数据库或存储中。 |
| 超时 | 单次运行允许的最长时间。例如,AWS Lambda 的上限是 15 分钟;许多平台的默认值则短得多。 |
| 边缘函数 | 在靠近用户的众多位置运行的函数,通常限制更严格。 |
| 缩容至零(Scale to zero) | 在没有流量时不运行任何东西,计算部分也不付费。 |
实例:一个小型预约网站
一家瑜伽工作室的预约网站,每周日晚上新课表发布时会迎来一阵访问高峰,其余时间访问量很少。
- 使用始终开启的服务器时,工作室要为一台 24 小时运行的机器付费,它的规模需要满足周日晚上的高峰,而其他时间大多闲置。
- 使用无服务器函数时,
GET /api/classes和POST /api/bookings都是函数。周日的高峰会自动启动许多副本;在周二早上的清闲时段,几乎没有任何东西在运行,账单接近于零。
权衡之处同样存在。周二早上第一个打开网站的人,可能会因为冷启动而多等一会儿。数据库则必须应对来自许多函数副本的大量短时连接,这可能需要连接池。另外,如果工作室之后想增加一个“生成所有人的年度出勤 PDF”的任务,它可能会超过函数的时间限制,需要放到别处运行。
何时适合,何时不适合
| 适合的情况 | 不太适合的情况 |
|---|---|
| 流量低、时高时低或难以预测 | 持续的大流量,此时一直开着可能更便宜 |
| 短促的请求/响应任务:API、表单处理程序、Webhook | 长时间运行的任务:大型视频处理、大数据导入 |
| 不想管理服务器的小团队 | 需要保持长连接的应用(某些聊天或多人游戏功能),除非平台支持 |
| 事件处理:“文件上传时,生成缩略图” | 需要在请求之间占用大量内存的应用 |
常见误解
- “无服务器就是没有后端。” 它的意思是无需管理服务器。你仍然需要编写并保护后端代码。
- “无服务器总是更便宜。” 在低用量时便宜,但按请求计费的价格在高峰、持续的大流量下可能会累积成一笔可观的费用。
- “无服务器可以无限扩展。” 平台有并发限制,而你的数据库可能远在函数之前就成为瓶颈。
- “函数里保存的文件下次还会在。” 本地存储是临时的。请使用数据库或文件存储。
- “缩容至零就等于无服务器。” 两者相关,但并不相同。有些平台把你的应用作为普通服务器运行,空闲时休眠,并在下一次请求时唤醒——节省的成本和首次请求的延迟与之相似,但没有按函数划分的单次请求时间限制。
可以向 AI 构建工具提出的要求
- “这个后端会以无服务器函数的形式运行,还是以始终开启或会休眠的服务器运行?这对成本意味着什么?”
- “是否有任务可能超过平台的时间限制?如果有,应该如何处理?”
- “所有需要持久保存的内容都存入数据库或文件存储,而不是保存在内存或本地文件中。”
- “如果许多副本同时运行,数据库连接应该如何管理?”
- “应用空闲一段时间后,第一次请求的延迟是多少?”
Mythex 如何托管应用
Mythex 并不把它的托管描述为无服务器函数。发布时,你的应用会以普通的网页应用或容器形式运行,由 Mythex 为你管理——无需进行任何托管设置。它采用缩容至零的方式:已发布的应用及其数据库在空闲时会休眠,并在下一次访问时唤醒;休眠中的应用不产生计算费用,只有在流量大时才会启动额外的机器(Pro 版每项服务最多 3 台)。附加的 Postgres 数据库在空闲 5 分钟后也会休眠,并按其醒着的时间计费。因此,你可以获得大部分“用多少付多少”的好处,但在长时间安静之后,第一次请求同样可能会有延迟。详见文档中的托管限制,以及我们关于网页托管和降低托管成本的指南。
常见问题
无服务器(serverless)简单来说是什么意思?
无服务器是指你把代码交给云服务商,只有在需要时才运行它,例如有请求到达时;你无需设置或照看任何服务器。通常你只为代码实际运行的时间付费,而不是为一台始终开着的机器付费。
无服务器真的没有服务器吗?
服务器仍然存在,只是你不需要管理它们。服务商在自己的机器上运行你的代码,在请求到达时启动它,在负载增加时扩容,在空闲时将其关闭。
什么是冷启动?
冷启动是指无服务器函数在空闲一段时间后运行时,由于服务商必须先启动一个全新的副本而产生的额外延迟。根据平台、编程语言和代码大小的不同,延迟可能从几乎察觉不到,到一秒或更久不等。
无服务器比普通服务器便宜吗?
对于流量少或时高时低的应用,通常更便宜,因为空闲时几乎不花钱。对于流量大且持续不断的应用,一直开着的服务器可能更划算。这取决于你的使用方式和服务商的定价。
有哪些无服务器平台的例子?
知名的例子包括 AWS Lambda、Google Cloud Run functions、Azure Functions、Cloudflare Workers,以及 Vercel 和 Netlify 等托管平台提供的函数功能。