有状态服务和无状态服务
引言
“有状态"和"无状态” 这个两词经常会出现在一些架构设计的文章中,怎么去理解这两个的含义?这2种场景下该如何做高可用,数据一致性怎么解决?
差异点
从数据层面看状态,数据的状态往往受2个维度有关,一是与时间相关或者顺序相关的,不同的操作顺序可能导致同一个时间点上的数据状态大于1个,二是与数据的副本状态相关的。也就是数据的位置,数据落在多个副本上,可能出现多种数据状态的组合。
从服务层面看,服务层面的状态取决于实例是单独维护数据还是共享数据,或者说是否存在多个数据闭环让数据的流向产生了多条路径。有状态的服务往往比较难进行水平拓展,在现在容器盛行的环境,把服务设计成无状态的更加高效,即便是有状态的服务,也要将状态内敛在系统的某个范围,比如分布式的存储,对于业务服务,我不需要关心数据在多个副本的状态,数据的状态由分布式存储这个服务本身解决。
有状态服务
- 服务本身依赖或者存在局部的状态数据,这些数据需要自身持久化或者可以通过其他节点恢复。
- 一个请求只能被某个节点(或者同等状态下的节点)处理。
- 存储状态数据,实例的拓展需要整个系统参与状态的迁移。
- 在一个封闭的系统中,存在多个数据闭环,需要考虑这些闭环的数据一致性问题。
- 通常存在于分布式架构中。
无状态服务
- 服务不依赖自身的状态,实例的状态数据可以维护在内存中。
- 任何一个请求都可以被任意一个实例处理。
- 不存储状态数据,实例可以水平拓展,通过负载均衡将请求分发到各个节点。
- 在一个封闭的系统中,只存在一个数据闭环。
- 通常存在于单体架构的集群中。