可扩展的 http 会话管理(java、linux)

2022-09-03 07:26:40

是否有可扩展 http 会话管理的最佳实践?

问题空间:

  • 购物车类型的用例。用户网店遍布网站,最终退房;必须保留会话。
  • 多个数据中心
  • 每个数据中心中的多个 Web 服务器
  • Java, linux

我知道有很多方法可以做到这一点,我总是能想出自己的具体解决方案,但我想知道stackoverflow的人群智慧是否可以帮助我专注于最佳实践。

一般来说,似乎有几种方法:

  • 不要保留会话;总是无状态地运行,虔诚地[对我不起作用...]
  • 使用j2ee,ejb和该团伙的其余部分
  • 使用数据库来存储会话。我想有一些工具可以使这更容易,所以我不必自己制作
  • 使用 memcached 存储会话(或其他类型的中间半持久性存储)
  • 使用键值数据库。“更持久”,而不是memcached
  • 使用“客户端会话”,这意味着所有会话信息都存在于隐藏的表单字段中,并在客户端之间向前和向后传递。服务器上不存储任何内容。

有什么建议吗?谢谢


答案 1

我会使用一些标准的分布式缓存解决方案。可能是你的应用程序服务器提供的,可能是memcached的,可能是兵马俑,只要你使用足够流行的东西(所以你知道大多数错误已经被追捕了),你选择哪一个可能并不重要。

至于你的其他想法:

  • 不要保留会话 - 正如你所说不可能
  • 客户端会话 - 太不安全 - 假设有人破解cookie将折扣价放入购物车
  • 使用数据库 - 数据库通常是最难解决的瓶颈,不要在那里放太多你绝对必须的。

这些是我的2美分:)

关于多个数据中心 - 您将希望会话与启动它的数据中心具有某种相关性。我不认为有任何分布式缓存解决方案可以在不同的数据中心之间工作。


答案 2

您似乎错过了列表中的香草复制的http会话。任何值得其盐的 servlet 容器都支持跨集群复制会话。只要您放入会话中的项目不是很大,并且是可序列化的,那么就很容易使其正常工作。

http://tomcat.apache.org/tomcat-6.0-doc/cluster-howto.html

编辑:但是,Tomcat 会话复制似乎不能很好地扩展到大型集群。为此,我建议使用JBoss+ Tomcat,它给出了“伙伴复制”的想法:

http://www.jboss.org/community/wiki/BuddyReplicationandSessionData


推荐