今天我们来谈一谈服务的状态,服务的状态指的是请求是否与不同的服务实例相关。分为两种,有状态和无状态。
无状态服务重要特征是同一个输入对于每个服务实例都会有确定的相同的输出,它要求服务要么是没有存数据只有算法,要么是所有节点的数据均相同。
举个例子,例如电商系统有多个服务实例,用户登陆认证后,向购物车中加入商品和查询购物车中有哪些商品,对于这两个操作无论分配到那个具体的服务实例,都可以保证得到的数据是一致的。
无状态服务的优点?
方便横向扩展,运维简单,可以很容易地增减节点
如何实现无状态服务?
1 服务不保存数据,服务只提供算法和逻辑,那么自然就不会有状态,例如有个压缩文件的服务,他有多个实例,无论调用那个实例我们均可以得到压缩的结果。
2 服务保存请求相关的数据,同时这些数据在所有节点均相同,一般是通过引入第三方的存储,多个服务实例,依赖同一个第三方服务。这样也可以实现服务的无状态。
有状态的服务更加的常见,同一服务的不同实例所拥有的数据不一样,同样说到登陆这个场景,有状态的服务是这样的,用户一的登陆状态可能只保存在服务A中,当请求分配到服务B时,用户是未登陆的状态。那么有状态的服务就必须要保证,每个请求都能准确的落到拥有它状态的那个节点上。常用的做法用一致性hash算法,来实现请求的分配。
有状态服务的优点
1 本地保存着数据,在处理时会减少网络开销。
2 模型简单,可用性和一致性容易保证。
有状态服务如何保证请求落到同一实例上?
1 简单的hash取模,或者一致性hash
2 长连接
有状态与无状态最本质的区别在于,节点的数据是否是全量数据,无状态的服务每个节点的数据均是全量。有状态的服务则不是。