'一个应用程序不应该有状态。状态应保存在数据库所在的数据层中'
有些设计符合规范,被恰当地称为“无状态架构”。是否每个架构都应该是无状态的当然是值得怀疑的,而且这个术语也可能会引起争论。
大多数“无状态”应用程序实际上确实有状态,但按照上述规则(无双关语),此状态保存在一个全局位置;数据库。正如 Peter 提到的,这样做的原因可能是可维护性和简化,但也经常听说这是为了scalability
. 没有状态出现在数据库中的任何地方,它被认为很容易添加额外的前端服务器、处理服务器,以及你拥有的东西。
虽然这确实有一些优点,但我认为我们确实必须区分临时状态和权威状态。
临时状态可以是您在订购过程中所处的位置以及您已经输入的详细信息。在Java EE 中,您可以将其保留在例如@ConversationScoped bean 或@Stateful bean 中。因此,这是您保留在 Web 层内部的状态。业务层。
这样做的优点是易于使用、性能和卸载您的单个中央数据库。当然,您也可以将临时状态存储在中央数据库中,但您可能希望将其远离常规的非临时数据,这意味着需要一些额外的编程复杂性。从 Web 层检索数据通常也更快,并且它从数据库中移除了一些负载。
在许多系统中,只有一个主数据库(一个接受写入的数据库),因此这个单一数据库可能会成为该设置的巨大瓶颈。
根据您的实际架构和设置,不在数据库中保留临时状态可能实际上会提高您的扩展能力。
缺点是您确实需要您的客户端坚持使用当前保存临时状态的单个服务器。这就是典型的“粘性会话”。如果与该客户端交互的一台服务器出现故障或需要重新启动或其他任何情况,客户端将丢失此临时数据。有一些方案,例如将状态复制到集群中的所有节点或附近的节点(伙伴复制),但这会使事情再次变得复杂,并且可能会使网络过载(如果所有节点不断地相互复制)。
权威状态意味着它代表了作为唯一信息来源的共享数据。这种状态是我们几乎总是喜欢在一个中心位置拥有的东西,但有时你会看到它被存储在一个 web 节点中。
例如,假设我们有一个最近价格列表,而不是将其保存到中心位置,我们将其保存在输入它的 Web 节点上。现在有一个包含此信息的“唯一”网络节点的概念,其他服务器可能会开始假设只有这个“唯一”网络节点。现在不可能添加额外的节点,因为它打破了这个假设。