服务状态处理

单体条件下面,服务只有一个,因此状态每个时刻也就只有一种状态。在分布式集群环境下面,就存在一个状态同步问题,因此也有有状态服务设计和无状态服务设计。比如 session,如果 session 保存在每一台服务器上,那么就是有状态设计,可能会出现集群内,服务状态不一致的现象;如果 session 由专门的一台服务器来保存,就是无状态设计,服务不保存状态,需要的时候从同一的服务器中获取,保证了服务在任何时刻的状态一致。

  • 无状态服务(stateless service)对单次请求的处理,不依赖其他请求,也就是说,处理一次请求所需的全部信息,要么都包含在这个请求里,要么可以从外部获取到(比如说数据库),服务器本身不存储任何信息

  • 有状态服务(stateful service)则相反,它会在自身保存一些数据,先后的请求是有关联的

有状态的服务,会有比较明显的缺点,服务间数据需要同步,成为副本关系,逻辑复杂也浪费资源;无状态的应用服务器,不保存上下文信息,只负责对用户的每次请求提交数据进行处理然后返回处理结果。无状态应用服务器之间是对等的关系,无依赖,请求到哪个服务器,处理结果都一样的。

对于高可用服务的构建要求来说,快速 failover 以及快速扩容是非常重要的 服务有状态,服务当机就可能会存在数据丢失;关键是快速扩容,有状态服务会有冷启动的问题,还需要先加载数据才能对外提供服务。在进行系统设计时,时刻要有这个意识,我们的应用服务器,要设计成无状态,不保存任何上下文信息。