Jakarta ee cookie+;Play 2.0中的缓存机制与Java EE HttpSession相比?

Jakarta ee cookie+;Play 2.0中的缓存机制与Java EE HttpSession相比?,jakarta-ee,playframework-2.0,Jakarta Ee,Playframework 2.0,我知道,出于可伸缩性的原因,我们通常不喜欢在服务器上维护会话状态,但我不明白为什么Play2.0采用的方法据说比老式的HttpSession更好 我看到的一个主要区别是,HttpSession实现是由容器提供的,因此HttpSession的扩展功能取决于它。使用容器管理的会话(及其封装状态)意味着当您想要水平扩展时,所涉及的系统还必须确保复制此状态,因为没有此状态,应用程序将无法工作。使用您的应用程序的客户端有效地绑定到用户恰好被定向到的特定节点 相比之下;当您的应用程序在任何时候都不保持真正的

我知道,出于可伸缩性的原因,我们通常不喜欢在服务器上维护会话状态,但我不明白为什么Play2.0采用的方法据说比老式的HttpSession更好


我看到的一个主要区别是,HttpSession实现是由容器提供的,因此HttpSession的扩展功能取决于它。

使用容器管理的会话(及其封装状态)意味着当您想要水平扩展时,所涉及的系统还必须确保复制此状态,因为没有此状态,应用程序将无法工作。使用您的应用程序的客户端有效地绑定到用户恰好被定向到的特定节点


相比之下;当您的应用程序在任何时候都不保持真正的会话状态时(就像您的Play应用程序应该保持的那样),横向扩展非常容易:只需添加更多运行应用程序的节点,并确保前端HTTP服务器了解新节点。没有花哨的算法和“企业平台”可以在所有节点上复制和维护会话。

不,实际上比这要复杂一点。Play实际上推动了一个无状态的应用程序架构。也就是说,您没有在会话中存储任何数据。没有任何内容,只能存储凭据

第一条规则:会话存储被导出到数据库。从数据库中获取数据,而不是从会话中获取数据。数据库的可伸缩性要比JVM应用程序容易得多


第二条规则:除凭证外,不存储任何内容。也就是说,对于会话状态,您必须以其他方式传输信息。有两种主要的方法可以做到这一点。使用隐藏字段,我认为这不是最好的方法。其次,使用绝对URL。创建包含ID、搜索和其他内容的URL

这有许多优点。本质上,游戏中的会话模型促进了无共享架构。这意味着您执行的每个动作(如果您按照播放升级的模式执行)都是一个RESTful请求,该动作的执行是完全自包含的。这意味着可以单独对每个请求进行单元测试,并将应用程序构建为一组离散函数

这里的原则是,每个操作之间的耦合越少,fat会话处理的会话状态越少,代码就越干净,越健壮


作为一个副作用,您还可以通过水平添加更多节点来轻松扩展,这通常比垂直扩展更便宜,并且比粘性会话更简单和风险更小。

IMHO,复制本身并不绑定到JEE HttpSession。这只是某些容器选择实现的“特性”。他们也可以选择将会话放在全局存储中。@Andreasteffan即使会话存储在全局存储中,全局存储也是您必须预见和维护的。如果你有这个基础设施,有人支持,那就太好了。会话并不坏,只是无状态方法通常更容易、更高效(在可伸缩性和开发方面)-IMO:-)我可能遗漏了一些东西,但我没有看到任何东西禁止容器使用数据库支持HttpSession实现。什么都没有。你可以这么做。但是,在会话中仍然没有强类型。对象生命周期如何?您的对象从什么时候开始过时,何时清空会话?java开发人员通常不会这样做。他们依靠垃圾收集器。会话超时情况如何?你怎么处理这些?处理所有这些问题的最简单方法是避免会话并设计无状态的应用程序。>不要从会话中获取数据,而是从数据库中获取数据-但是您的应用程序是无状态的,还是将分布式会话存储(每个节点上的http会话)替换为一个中央会话存储(DB)?添加了playframework标记,因为这个问题适用于播放1或播放2,因为会话和缓存原理是相同的,如果应用程序中只存在状态呢?自包含请求是否需要从某个地方获取数据,例如,每个请求都需要一个中央数据库?是的,它将从数据库获取数据,或者最初从缓存获取数据,如果不存在,则从数据库获取数据。其想法是http服务器可能会死掉,而另一台服务器会接管,因为状态不在应用服务器层……因此,它使体系结构更加健壮(由于DB读取而导致性能损失)