作者:Grey
原文地址:
无状态的服务
在横向扩展服务的过程中,将状态(例如用户会话数据)从服务中移出并将会话数据存储在持久性存储介质中,如关系型数据库或 NoSQL。集群中的每个服务都可以从数据库中访问状态数据。这就是所谓的无状态服务。架构如下
有状态的服务
和无状态服务不一样,有状态的服务从一个请求到下一个请求都会记住客户数据(状态)。而无状态服务器不保留任何状态信息,架构如下
上图中,如果使用有状态服务,用户1的状态数据(比如:会话数据和资料图片)都存储在Server 1中。如果这是一个验证用户身份的服务,为了验证用户1,请求必须被发送到 Server 1 上。如果请求被发送到其他服务器,如 Server 2,认证将失败,因为 Server 2 不包含用户 A 的会话数据。同样地,来自用户2的所有请求必须被路由到 Server 2;来自用户3的所有请求必须被发送到 Server 3。
这就会导致一个问题:来自同一个客户端的每个请求都必须被路由到同一个服务器。虽然可以通过负载均衡器的粘性会话来完成这个功能,但是这增加系统复杂度和开销。使用这种方法,在增加或删除服务的时候比较困难。
使用无状态服务,来自用户的请求可以被发送到任何服务节点,这些服务节点从共享数据存储中获取状态数据。状态数据被存储在共享数据存储中。无状态系统更简单、更稳健、可扩展。
无状态服务中的共享数据存储可以是一个关系型数据库、Memcached/Redis、NoSQL等。选择 NoSQL 数据存储是因为它很容易扩展。可以实现自动缩放(根据流量负载自动添加或删除服务)。在状态数据被单独存放在一个共享存储以后,通过根据流量负载添加或删除服务,可以很容易地实现网络层的自动扩展。