服务的状态是指什么?无状态服务和有状态服务的区别有哪些?服务状态的容错设计有哪些?

打卡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 等等。

强一致性的系统一般会使用两阶段提交。

左耳朵耗子带你重学《左耳听风》

https://time.geekbang.org/column/article/4086