Java web - 水平可扩展性的会话设计

Java web - sessions design for horizontal scalability

我绝对不是专家 Java 编码员,我需要在我的 java 基于 Servlet 的 Web 应用程序中实现会话,据我所知这通常是通过 HttpSession 完成的。然而,这种方法将会话数据存储在本地文件系统中,我不想对水平可伸缩性有这样的限制。因此,我想将会话保存在应用程序通过 REST 接口与之通信的外部数据库中。 基本上在我的应用程序中有用户执行一些操作,例如搜索。因此,我要在会话中坚持的本质上是登录数据和与搜索相关的元数据。

作为主要的数据存储,我打算使用无图数据库SQL,问题是:假设我最终也可以为会话使用另一种数据库,哪种架构更适合这种情况?

我目前想到了两种可能的方法。第一个使用另一个数据库(例如 SQL 数据库)来存储会话数据。通过这种方式,我将拥有更加分散的工作负载,因为我没有将主存储也用于会话。此外,我还有一个更有条理的环境,即会话状态变量和持久变量,不会混淆。
第二种方法是将与任何会话相关的所有信息存储到主数据库的 "user node" 中。此时 sessionid 将只是一个 "shortcut" 用于身份验证。这样我就不必依赖第二个数据库,但是我将所有工作负载移动到主数据库,将会话数据与持久数据混合在一起。

有什么标准的通用架构可以参考吗?我是否遗漏了一些应该限制我的架构的重要点?

您将会话存储在不同位置的想法很好。使用像 memcached or redis 这样的内存缓存怎么样?会话数据通常不会长期存在,因此除了成熟的数据库之外,您还有其他选择。 Memcached & Redis 既可以集群又可以水平扩展。