Loading

架构设计(五):有状态服务和无状态服务

架构设计(五):有状态服务和无状态服务

作者:Grey

原文地址:

博客园:架构设计(五):有状态服务和无状态服务

CSDN:架构设计(五):有状态服务和无状态服务

无状态的服务

在横向扩展服务的过程中,将状态(例如用户会话数据)从服务中移出并将会话数据存储在持久性存储介质中,如关系型数据库或 NoSQL。集群中的每个服务都可以从数据库中访问状态数据。这就是所谓的无状态服务。架构如下

img

有状态的服务

和无状态服务不一样,有状态的服务从一个请求到下一个请求都会记住客户数据(状态)。而无状态服务器不保留任何状态信息,架构如下

img

上图中,如果使用有状态服务,用户1的状态数据(比如:会话数据和资料图片)都存储在Server 1中。如果这是一个验证用户身份的服务,为了验证用户1,请求必须被发送到 Server 1 上。如果请求被发送到其他服务器,如 Server 2,认证将失败,因为 Server 2 不包含用户 A 的会话数据。同样地,来自用户2的所有请求必须被路由到 Server 2;来自用户3的所有请求必须被发送到 Server 3。

这就会导致一个问题:来自同一个客户端的每个请求都必须被路由到同一个服务器。虽然可以通过负载均衡器的粘性会话来完成这个功能,但是这增加系统复杂度和开销。使用这种方法,在增加或删除服务的时候比较困难。

使用无状态服务,来自用户的请求可以被发送到任何服务节点,这些服务节点从共享数据存储中获取状态数据。状态数据被存储在共享数据存储中。无状态系统更简单、更稳健、可扩展。

无状态服务中的共享数据存储可以是一个关系型数据库、Memcached/Redis、NoSQL等。选择 NoSQL 数据存储是因为它很容易扩展。可以实现自动缩放(根据流量负载自动添加或删除服务)。在状态数据被单独存放在一个共享存储以后,通过根据流量负载添加或删除服务,可以很容易地实现网络层的自动扩展。

参考资料

System Design Interview

posted @ 2022-12-17 17:40  Grey Zeng  阅读(716)  评论(1编辑  收藏  举报