首页 > 解决方案 > 与特定会话相关的客户端请求如何路由?

问题描述

假设您在后端使用spring MVC,现在想象一个客户端向服务器发出请求,该请求的会话对象被发出并保存在服务器中一段特定的时间,然后才过期,现在每次一个人请求是由该客户端发出的,服务器通过会话对象记住它是哪个客户端。

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

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

标签: javaspringmodel-view-controllerserver

解决方案


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

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

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


推荐阅读