服务最好是无状态的是什么意思

2023-01-20 10:20:36 +08:00
 spr1ngs

有懂的大哥吗

5090 次点击
所在节点    程序员
29 条回复
inreality
2023-01-20 14:31:34 +08:00
只处理输入->输出, 不存储任何需要变更状态的数据
fkdog
2023-01-20 14:41:37 +08:00
一般来说这个状态指的是,计算机在本地节点存储一些业务数据,每个节点存下来的数据都不一样,可能会导致系统异常。

比如站点访问计数器,你把这个计数变量存成全局变量,那么每个节点都有一个全局变量,各自统计各自的。
还有就是 tomcat 的 session 也是存在单个节点的内存里,如果请求 cookie jsessionid 分发到了其他节点上,那么可能就会出现用户未登录的情况。
litchinn
2023-01-20 14:44:14 +08:00
可以理解为更换服务器或容器部署后,对用户 /使用方无感知,反例:请求 1 在服务器 a 上写文件,请求 2 读取,这就是有状态,更换服务器 b 部署后请求 2 无法正确读取文件
kaneg
2023-01-20 18:56:42 +08:00
无状态的服务可以随时扩容 /缩容,集群中任意一个 /几个 down 机都不影响对外服务的可用性。
v2lf
2023-01-20 19:54:28 +08:00
每个事务不互相依赖; 之后的事务不依赖之前事务的状态。
这里事务单纯指操作序列。
Breacher
2023-01-20 23:10:09 +08:00
假设有一个后端 HTTP API 应用,应用可以有 N 个实例,这些实例是使用同样的应用程序配置、彼此等价的、能够随时互相替代,这 N 个实例作为一个整体对外提供服务,共同处理用户的请求。假设某个时刻有用户 A 发起的请求 request1 由实例 instance1 处理了,用户 A 的后续请求 request2, request3, ... requestN 能够由任意一个实例完成,而不是非得是 instance1 。

要做到这样,实例们就不能把数据保存在实例进程的内存、本地磁盘或者本地文件,如果非要把数据保存在实例进程的内存、本地磁盘或者本地文件,那么在保存在某个特定实例的数据就无法由其他实例获取到,这个实例也就是有状态了,因为后续所有依赖这个数据的请求都得要来到这一个特定实例而不能是其他实例。最典型的状态数据就是用户的登录态 了,一般把登录态存储在一个所有实例都能访问到的存储组件中,比如 MySQL/Redis ,这样子,就用户登录态功能而已,这个应用就是无状态的,因为所有实例都是去 MySQL/Redis 获取登录态,它们都能获取到。
irytu
2023-01-21 01:24:11 +08:00
无状态比较容易去做 scale out
Nnq
2023-01-21 05:07:55 +08:00
就是可以想停就停 想开就开 无影响
vinceall
2023-01-31 17:01:42 +08:00
没有 session ,token 随身带,方便扩容

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/910002

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX