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



假设 -

  1. 反向代理后面有4个服务器,它充当负载平衡器
  2. 负载平衡器纯粹是负载平衡,并根据其当前负载将请求发送给4个服务器中的任何一个
  3. 需要对用户进行身份验证以访问此应用程序,并且某些空间应保持所有用户的状态,因为反向proxy仅负载平衡
  4. 应用需要扩展超过4个服务器,例如4000台服务器。


问题 -

  1. 在一个大型多服务器系统中,他拥有所有用户的状态 - 加载平衡器,每个服务器,单独的服务器?
  2. 所有用户的状态是否已保存在所有服务器上,以便负载平衡器可以向任何服务器发送请求?这个规模如何给100m用户?

您可以使用粘性会话。它使负载平衡器可以将用户的会话绑定到特定实例。这样可以确保会话期间用户的所有请求都发送到同一实例。阅读粘性和非粘性会议。

还可以说,由于某种原因,该实例被杀死,为了维持状态,身份验证令牌和其他信息也可以保存在单独的REDIS缓存上,这要快得多地查询。阅读微服务中的会话管理

  1. 在无状态的多服务器系统中,单独的服务器(身份验证服务器)或单独的服务器群集(身份验证API)保持所有用户的状态。如果它是用于大型应用程序的单个身份验证服务器,则可以预期它的RAM在100秒的GB范围内,也许更多。

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

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

如果可能的话,请尝试使您的申请保持无状态。无状态应用程序的性能将更好,并且比状态应用程序更容易扩展!

最新更新