文章目录
无状态服务与有状态服务
两者定义:
- 无状态服务(stateless service) 对单次请求的处理,不依赖其他请求,也就是说,处理一次请求所需的全部信息,要么都包含在这个请求里,要么可以从外部获取到(比如说数据库),服务器本身不存储任何信息
- 有状态服务(stateful service) 则相反,它会在自身保存一些数据,先后的请求是有关联的。即服务端需要记录每次会话的客户端信息,从而识别客户端身份,根据用户身份进行请求的处理。典型的设计如tomcat中
的session。例如登录:用户登录后,我们把登录者的信息保存在服务端 sesssion中,并且给用户一个cookie值,记录对应的session。然后下次请求,用户携带cookie值来,我们就能识别到对应session,从而而找到用户的信息。
示例:
- 无状态数据示例:一个Web服务器返回静态HTML页面。无论谁发出请求或何时发出请求,服务器总是返回相同的页面内容,不需要记住之前的请求。
- 有状态数据示例:一个在线购物车系统。系统需要记住每个用户的购物车内容,直到他们完成购买。这意味着系统必须在多次请求之间维护和更新状态信息。
状态服务与无状态服务比较:
-
单体条件下面,服务只有一个,因此状态每个时刻也就只有一种状态。在分布式集群环境下面,就存在一个状态同步问题,因此也有有状态服务设计和无状态服务设计。比如session,如果session保存在每一台服务器上,那么就是有状态设计,可能会出现集群内,服务状态不一致的现象;如果session由专门的一台服务器来保存,就是无状态设计,服务不保存状态,需要的时候从同一的服务器中获取,保证了服务在任何时刻的状态一致。
-
有状态的服务,会有比较明显的缺点:
- 服务间数据需要同步,成为副本关系,逻辑复杂也浪费资源(这也是分布式系统最为关键的问题) ;
- 服务端保存大量数据,增加服务端压力;
- 服务端保存用户状态,无法进行水平扩展;
- 客户端请求依赖服务端,多次请求必须访问同一台服务器;
-
无状态的应用服务器,不保存上下文信息,只负责对用户的每次请求提交数据进行处理然后返回处理结果 无状态应用服务器之间是对等的关系,无依赖,请求到哪个服务器,处理结果都一样的。
再抽象下
无状态就是一次操作,不能保存数据。
有状态就是有数据存储功能,既然可以存储数据,而数据又是变化的,在分布式系统中,种种问题也都是因为数据同步引起的。在CAP定理中,因为P的存在就导致了要在C、A中做选择。
参考文章:
精通有状态与无状态:https://www.iteye.com/topic/960532
分布式系统中的“无状态”和“有状态”详解:https://cloud.tencent.com/developer/article/1620559
分布式无状态设计及幂等设计:https://www.jianshu.com/p/f8745ab297a4