【问题标题】:User state in a big (high traffic) application大型(高流量)应用程序中的用户状态
【发布时间】:2017-07-10 15:24:10
【问题描述】:

假设 -

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


问题 -

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

【问题讨论】:

    标签: session reverse-proxy session-state horizontal-scaling


    【解决方案1】:

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

    同样假设实例由于某种原因被杀死,为了保持状态,还可以将身份验证令牌等信息保存在单独的redis缓存中,这样查询起来要快得多。阅读Session Management in microservices

    【讨论】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-26
        • 1970-01-01
        相关资源
        最近更新 更多