无状态与有状态微服务

时间:2019-11-04 15:42:19

标签: java spring stateless

我正在阅读有关无状态微服务的一些信息。我的问题很简单。的确,如果微服务具有一些持久性存储,那将使其成为有状态的微服务。总是这样吗?任何意见将不胜感激。

1 个答案:

答案 0 :(得分:2)

有状态性和无状态性通常与数据库持久性无关。另外,状态(完全)(较少)有不同的级别,我将尝试列举一些示例:

我们可以说微服务如果没有在其内部存储中保存对服务客户端至关重要的信息,而是在外部存储(可以是有状态的)中存储数据,则它是无状态的。一个很好的想法实验是假设您的服务在每个请求之间的不同节点上重新启动。如果服务可以这种方式实现其目的,则通常可以将其视为无状态。另一个示例是,负载平衡器可以在不使用粘性会话的无状态服务中随机平衡请求。就是说,如果您的服务将数据保留在本地存储(文件系统等)中,然后在另一个节点中重新启动,并且此数据对于功能良好至关重要,那么它不是无状态的。因此,无状态性不严格限于不将数据保存在内存中。

有状态服务可以是在客户端访问之间保持某种状态的任何事物,并且鉴于该状态被破坏,某些请求将失败。

内部具有状态但外部具有无状态API的应用程序使事情变得复杂。例如,基于角色的系统可以称为有状态的(服务彼此了解),但是自动故障转移(将来自死节点的角色迁移到活动节点)可以保证与持久性角色状态存储配对使用时的可靠性。如您所见,整体服务是有状态的,但是通过API进行的交互是无状态的。

比这些流行语更重要的是,您的应用程序在某些边缘条件下的行为:

  • 在扩展期间(添加节点)处理现有的进程/会话/请求
  • 处理服务或节点的意外重启或终止
  • 在网络分区期间处理请求
  • 还有更多类似的东西...

在这些情况下,如果您的服务可以保持一致和高效,那么您一切都很好。