知识卡片
有状态会话不可避免的情形:购物车案例
内容
无状态设计的资源效率虽然诱人,但并不是所有场景都能做成无状态——很多与客户端的交互本身就带有状态性质。典型例子是电商购物车:用户一边浏览商品一边往车里加东西,这些”已选中但尚未结账”的信息必须贯穿用户整个会话持续存在,这本质上是一个尚未提交的有状态业务事务,意味着这次会话必须是有状态的。有意思的是,”有没有状态”这件事本身可能是动态变化的:一个只浏览、不购买的用户,这次会话就是无状态的;一旦他往车里加了一件商品,会话立刻就变成了有状态——换句话说,除非完全没人下单购买,否则应用注定无法彻底避开状态问题,必须正面想清楚该怎么处理它。作者随后提示了一个不那么直观的可能性:即使会话本身是有状态的,也完全可以用无状态服务器对象来实现这个有状态的会话——状态可以被外置存储、而不必绑死在处理请求的那个服务器对象身上,只是作者自己坦言,这样做未必总是理想的选择(后续章节会展开具体的存储方式取舍)。
参考来源
- 位置:《企业应用架构模式》第一部分"表述"之"第6章 会话状态"之"6.1 无状态的价值"(源文件:_epub-src/OEBPS/Text/000042.html)
- 结论依据:原文说明"想一想在成千上万的电子商务应用中用到的购物车。用户的交互包括浏览书籍和选择想买的书。购物车信息必须在用户的整个会话中保存。实质上这是一个有状态的业务事务,也就说明会话必须是有状态的……因此不能避免状态的使用,除非没人买书……好消息是:用无状态服务器可以实现有状态的会话,有趣的是,我们可能并不愿意那样做",直接支撑本卡结论。
- 原始内容:如果只是浏览一下而并不买书,会话就是无状态的,一旦买了,就是有状态的。因此不能避免状态的使用,除非没人买书。