服务的状态是指什么?无状态服务和有状态服务的区别有哪些?服务状态的容错设计有哪些?
打卡Day12:今天学习了《45|弹力设计篇之“服务的状态”》,我的收获如下:
服务的状态
就是为了保留程序的一些数据或是上下文。比如登陆Session、业务逻辑运行上下文Context。
无状态服务 Stateless
函数式编程。immutable不变的,只描述其逻辑和算法,根本不保存数据,也不会修改输入的数据,而是把计算好的结果返回出去。
无状态的服务被当作分布式服务设计的最佳实践和铁律。扩展性和运维方便,可以随意增减节点,随意搬迁,无明显副作用。
需要保状态保存到第三方有状态的存储服务,如Redis、MySQL、Zookeeper、Etcd、或分布式文件系统。
缺点是增加了网络开销,而在本地缓存有会浪费资源。
有状态服务 Stateful
有状态服务的好处:
- 数据本地化(Data Locality);
- 更高的可用性和更强的一致性,即CAP的AC。
无状态服务把数据同步到不同节点,有状态服务通过Sticky Session做数据分片。
Sticky Session的实现方式:
- 持久化的长连接(一致性哈希、uid求模);
- Gossip协议(节点间互相同步元数据)。
服务状态的容错设计
Sticky Session的方式在实际运维过程中复杂度太高;最好利用分布式文件系统,在节点挂掉时快速启动新实例。
很多系统的高可用设计会采取数据在运行时就复制的方案,比如:ZooKeeper、Kafka、Redis 或是 ElasticSearch 等等。
强一致性的系统一般会使用两阶段提交。