客户端/服务器应用程序设计:无状态与有状态架构解析
1. 无状态应用程序分析
在开发应用程序时,我们实现了支持对话的代码,从用户的角度来看,对话是一系列工作单元。用户期望在工作流中执行一系列步骤,每个步骤都是临时的,直到最后一步结束对话。最后一步通常是客户端向服务器发出的最终请求,标志着对话的结束。这看似与事务类似,但为了完成特定的对话,可能需要在服务器上执行多个系统事务。
那么,如何在多个请求和系统事务之间实现原子性呢?用户的对话可能具有任意的复杂性和持续时间。在对话流程中,可能会有多个客户端请求加载分离的数据。由于我们可以控制客户端上的分离实例,因此只要在对话工作流的最终请求之前,不在服务器上合并、持久化或删除任何实体实例,就可以轻松实现对话的原子性。我们需要以某种方式对修改进行排队,并在用户思考时间内管理分离数据。在确定要“提交”对话之前,不要从客户端调用任何会在服务器上进行永久更改的服务操作。
需要注意的一个问题是分离引用的相等性。例如,如果我们加载了多个 Item
实例并将它们放入 Set
中,或者用作 Map
的键,由于我们是在对象标识的保证范围(即持久化上下文)之外比较实例,因此必须重写 Item
实体类的 equals()
和 hashCode()
方法。在只有一个分离的 Item
实例列表的简单对话中,这并不是必需的,因为我们从未在 Set
中比较它们,也未将它们用作 HashMap
的键或显式测