18 - 无状态思维:现代后端的核心原则
前面几章反复出现一个词:无状态。它不是一个可有可无的细节,而是让整套现代方案(Serverless + 云服务)能成立的核心原则。这一章把它彻底讲透。
什么是”状态”
状态:应用运行过程中产生的、需要被记住的数据。比如:
- 用户登录后的会话信息
- 用户上传的文件
- 购物车里的东西
- AI 对话的历史记录
有状态:把这些数据存在后端实例自己身上(进程内存、本地磁盘)。 无状态:后端实例自己不保存任何这类数据,每次请求需要的数据都从外部(数据库、对象存储、缓存)现取现存。
为什么现代后端必须无状态
回顾 Serverless 的脾气(第 14 章):实例随时被创建、销毁,请求可能落到不同实例上。在这种环境下:
- 如果你把登录会话存在实例 A 的内存里,用户下一个请求被分到实例 B → B 不认识他,登录失效
- 如果你把上传的文件存在实例本地磁盘 → 实例一销毁,文件全没
- 如果你把数据存内存,实例一扩缩容 → 数据丢失/不一致
一句话:实例是”用完即弃”的,任何存在实例身上的东西都靠不住。
所以现代后端必须无状态:实例只负责处理逻辑,不负责保存数据。
无状态怎么做:状态全部外置
把各种状态搬到实例之外的专门服务里:
| 状态 | 放哪(外置到哪) |
|---|---|
| 业务数据(用户、订单、对话记录) | 云数据库(第 16 章) |
| 用户上传的文件、图片 | OSS 对象存储 |
| 登录会话 / 临时缓存 | 云 Redis 等缓存服务,或用无状态的 Token(JWT) |
| AI 能力 | AI 云 API(第 17 章,能力本身也在外部) |
这样一来,后端实例本身就变成了一个纯粹的”处理器”:请求来了,从外部取数据 → 算 → 把结果存回外部 → 返回。它自己不留任何东西,随便被开被关都没关系。
[配图:中间是多个可随时增减的”无状态后端实例”,四周是数据库、OSS、缓存、AI API 等外部服务;数据都在四周,实例只是”过路的处理器”]
无状态带来的巨大好处
正因为无状态,现代方案的种种优点才成立:
- 能自动伸缩:实例长得一模一样、可随意增减,平台才敢帮你自动扩缩容
- 能缩容到零:没人用时全关掉也不丢数据,才能真正省钱
- 挂了不怕:一个实例挂了,换一个继续,用户无感
- 好部署好回滚:实例不带数据,随便替换新旧镜像
反过来看:正是”无状态”这个设计,让 Serverless、自动伸缩、按量计费这些好处能落地。它是整套现代方案的地基。
一个常见的思维转变
从传统到现代,最需要转变的一个习惯:
传统:“先在服务器本地存着,反正就一台机器。” 现代:“我这段代码可能同时跑在 10 个实例上,也可能下一秒被换掉——所以任何要记住的东西,都得放到外面。”
写后端代码时,时刻问自己一句:“如果这个实例下一秒就被销毁,会丢东西吗?” 如果会,那这个东西就该外置。
小结
- 状态 = 需要被记住的数据;无状态 = 后端实例自己不存这些数据。
- Serverless 实例随时增减销毁,所以任何存在实例身上的东西都不可靠。
- 做法:把状态全部外置——数据进云数据库、文件进 OSS、会话用缓存/Token、AI 用云 API。
- 无状态是 Serverless 自动伸缩、缩容到零、容灾、易部署这些好处能成立的地基。
- 写代码时常问:“实例下一秒被销毁会丢东西吗?”
到这里,前端、后端、数据、AI 都安置好了。剩下最后一块拼图:怎么让用户用一个好记的网址、通过安全的 HTTPS 访问到它们。进入第六部分。
下一章 → 19 - 域名与 DNS 配置