【问题标题】:How are client requests related to a specific session routed?与特定会话相关的客户端请求如何路由?
【发布时间】:2020-09-20 08:39:03
【问题描述】:

假设您在后端使用 spring MVC,现在假设客户端向服务器发出请求,该请求的会话对象在到期前被创建并保存在服务器中特定的时间,现在每个该客户端发出单个请求的时间,服务器通过会话对象记住它是哪个客户端。

我的问题是,在生产设置中,一个应用程序中可能有数千个这样的服务器,是什么负责确保客户端发出的任何后续请求最终都会发送到包含有关客户端的会话信息的服务器?

例如,假设有 5 台服务器 1、2、3、4、5 的应用程序。客户端向应用程序发出请求,请求最终到达服务器 4,当请求到达服务器 4 时,会为客户端创建会话。现在假设客户端向服务器发出另一个(全新的)请求,应用程序如何知道该请求应该被路由到先前存储该客户端会话信息的服务器 4?

【问题讨论】:

    标签: java spring model-view-controller server


    【解决方案1】:

    应用程序没有。有两种通用方法:

    • “粘性会话”,其中实例前面的负载均衡器会跟踪会话并将它们每次路由到相同的实例。这既快又脏,但它的主要缺点是脆弱。例如,如果实例崩溃或因升级或缩减而关闭,您就输了。

    • 将会话信息存储在其他位置。 Spring 使用 Spring Session 使这一切变得简单。 (我个人更喜欢使用 Redis 和 JSON 序列化。)在这种情况下,过滤器会为每个请求检索会话,并在必要时更新存储的版本。

    【讨论】:

    • 或两者的组合,其中请求通过粘性会话路由到在内存或附近缓存中具有会话的服务器,直到该服务器过载或被关闭/崩溃,之后另一台服务器从持久存储中加载整个会话。
    • @ErwinBolwidt 当然,您可以进行组合,但是一旦您已经拥有“任何服务器都可以为请求提供服务”功能,其他任何东西都只是一种提高性能的尝试。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-30
    • 2021-10-26
    • 2014-07-23
    相关资源
    最近更新 更多