大型(高流量)应用程序中的用户状态

User state in a big (high traffic) application

假设 -

  1. 有 4 台服务器位于充当负载平衡器的反向代理后面
  2. Load Balancer 是纯粹的负载均衡,根据当前负载向 4 台服务器中的任意一台发送请求
  3. 访问此应用程序的用户需要经过身份验证,一些space应该保存所有用户的状态,因为反向代理只是负载平衡
  4. 应用程序需要扩展到超过 4 个服务器,比如 4000 个服务器。


问题 -

  1. 在大型多服务器系统中,谁拥有所有用户的状态 - 负载平衡器、每个服务器、单独的服务器?
  2. 是否所有服务器上都保存了所有用户的状态,以便负载均衡器可以向任何服务器发送请求?这如何扩展到 1 亿用户?

您可以使用粘性会话。它使负载平衡器能够将用户会话绑定到特定实例。这确保了会话期间来自用户的所有请求都发送到同一个实例。阅读Sticky and NON-Sticky sessions

另外假设实例由于某种原因被杀死,为了保持状态,身份验证令牌和其他信息也可以保存在单独的redis缓存中,查询速度更快。阅读

  1. 在无状态多服务器系统中,一个单独的服务器(认证服务器)或一个单独的服务器集群(认证api)保存所有用户的状态。如果它是大型应用程序的单个身份验证服务器,您可以期望它具有 100 GB 范围内的 RAM,甚至更多。

  2. 不,所有用户的状态通常不会复制到所有应用服务器上,这将是一种巨大的资源浪费。身份验证服务器(或服务器集群)本身可以充当负载平衡器或将所有请求转发到单独的负载平衡器 - 对于无状态应用程序是正确的

在有状态应用程序中,各个服务器通过粘性会话保存用户状态。

如果可能,请尽量让您的应用程序保持无状态。无状态应用程序将具有更好的性能,并且比有状态应用程序更容易横向扩展!