java - 与特定会话相关的客户端请求如何路由?
问题描述
假设您在后端使用spring MVC,现在想象一个客户端向服务器发出请求,该请求的会话对象被发出并保存在服务器中一段特定的时间,然后才过期,现在每次一个人请求是由该客户端发出的,服务器通过会话对象记住它是哪个客户端。
我的问题是,在生产设置中,一个应用程序中可能有数千个这样的服务器,是什么负责确保客户端发出的任何后续请求最终到达包含有关客户端的会话信息的服务器?
就像假设在有 5 台服务器 1、2、3、4、5 的应用程序中。客户端向应用程序发出请求,请求最终到达服务器 4,当请求到达服务器 4 时,会为客户端创建会话。现在想象客户端向服务器发出另一个(全新的)请求,应用程序如何知道该请求应该被路由到服务器 4,该服务器先前存储了该客户端的会话信息?
解决方案
应用程序没有。有两种通用方法:
“粘性会话”,实例前面的负载均衡器跟踪会话并将它们每次路由到相同的实例。这既快又脏,但它的主要缺点是脆弱。例如,如果实例崩溃或因升级或缩减而关闭,您就输了。
将会话信息存储在其他地方。Spring 使用 Spring Session 使这一切变得简单。(我个人更喜欢使用 Redis 和 JSON 序列化。)在这种情况下,过滤器会检索每个请求的会话,并在必要时更新存储的版本。
推荐阅读
- python - 如何在不使用“shell=True”的情况下将“subprocess.run”结果写入日志文件?
- r - 将两列(其中一列有多个需要解析的文本字符串)提取到字符向量的命名列表中的 R 代码
- bokeh - 使用通过 StaticFileHandler 配置的 BokehTornado 实例的独立散景服务器未显示图像
- sql-server - 使用 1000 万行的表提高简单查询的性能
- python - 有没有什么方法可以从 python3 中的字符串定义函数名?
- protocol-buffers - Thrift、Avro 和 ProtoBuf 数据治理
- python - 运行迁移时出现“唯一约束失败”问题
- c++ - 如何使用数据对象上的 const 指针初始化类
- git - zsh中的git完成:__git_func_wrap:3::未找到
- javascript - 在 JavaScript 中获取给定类的所有 id 的简洁明了的方法是什么?