无状态与有状态微服务
Stateless vs Stateful Microservices
我正在阅读一些关于无状态微服务的信息。我的问题很简单。如果一个微服务有一些持久性存储,这是否真的使它成为有状态的微服务。总是这样吗?任何意见将不胜感激。
有状态和无状态通常与数据库持久性无关。此外,还有不同级别的状态(完整)(较少),我将尝试列出一些示例:
我们可以说微服务是无状态的,如果它不在其内部存储中保存对服务客户至关重要的信息,而是在外部存储(可以是有状态的)中保存数据。一个好的思想实验是想象您的服务在每个请求之间的不同节点上重新启动。如果服务可以通过这种方式实现其目的,则通常可以认为它是无状态的。另一个例子是负载平衡器可以随机平衡请求,而无需为无状态服务使用粘性会话。也就是说,如果您的服务将数据保存在本地存储(文件系统等)中,然后在另一个节点中重新启动,并且该数据对于正常运行至关重要,那么它就不是无状态的。所以无状态并不是严格限制在内存中不保存数据。
有状态服务可以是在客户端访问之间保持状态的任何东西,如果这个状态被破坏,一些请求就会失败。
对于内部有状态但外部无状态的应用程序,事情会变得复杂 API。例如,基于参与者的系统可以称为有状态的(服务相互了解),但如果与持久性参与者状态存储配对,自动故障转移(参与者从死节点迁移到活节点)可以保证可靠性。如您所见,整个服务是有状态的,但通过 API.
的交互是无状态的
比这些流行语更重要的是您的应用程序在某些边缘条件下的行为方式:
- 在扩展(添加节点)期间处理现有 processes/sessions/requests
- 处理服务或节点的意外重启或终止
- 在网络分区期间处理请求
- 还有更多类似的...
如果您的服务能够在这些情况下保持一致和高效,那么您就很好了。
"Is it true that if a microservice [has] some persisten[t] storage, that makes it [a] stateful microservice[?]
不,这不是真的。如果这是真的,那么几乎所有微服务都将是有状态的,因为几乎所有微服务都使用某种形式的持久存储。
如果您稍停片刻,以某种距离和不可知论的眼光看待 Web 应用程序,any Web 应用程序,来自从用户的角度来看,您会注意到它 绝对不是 无状态的。 (如果是,那将毫无用处。)至少,它为您提供了一些注册和登录的方式,因此它会记住您,这是持久状态,保存在持久存储中。但是,此 Web 应用程序可能是基于无状态微服务构建的。这些微服务可以访问应用程序的持久状态,但这并不能使它们成为有状态的。
A microservice is called stateful if it maintains some state of its own, and utilizes that state across service requests.
这个状态是否持续是无关紧要的。 (尽管这样更好,否则微服务将面临无法扩展和弹性的危险,这将使其不配被称为“微服务”,但那是另一回事了。)
因此,有状态微服务将在您登录时查询应用程序的主要持久存储以获取有关您的信息,然后只要您保持登录状态就记住该信息,以便保持为您的请求提供服务,而无需在应用程序的主要持久存储中查询每个请求的此信息。
从可用性的角度来看,有状态和无状态微服务的主要区别是:
使用无状态微服务,微服务的任何实例都可以处理来自任何客户端的任何请求。没有“会话”的概念,因此进入场的任何请求都可以路由到任何服务器,以及该服务器内该微服务的任何实例。
使用有状态微服务,您必须在客户端和特定服务器上的特定微服务实例 运行 之间建立会话。进入场并属于该会话的所有服务请求都必须路由到该特定服务器以及该服务器内微服务的特定实例。
我正在阅读一些关于无状态微服务的信息。我的问题很简单。如果一个微服务有一些持久性存储,这是否真的使它成为有状态的微服务。总是这样吗?任何意见将不胜感激。
有状态和无状态通常与数据库持久性无关。此外,还有不同级别的状态(完整)(较少),我将尝试列出一些示例:
我们可以说微服务是无状态的,如果它不在其内部存储中保存对服务客户至关重要的信息,而是在外部存储(可以是有状态的)中保存数据。一个好的思想实验是想象您的服务在每个请求之间的不同节点上重新启动。如果服务可以通过这种方式实现其目的,则通常可以认为它是无状态的。另一个例子是负载平衡器可以随机平衡请求,而无需为无状态服务使用粘性会话。也就是说,如果您的服务将数据保存在本地存储(文件系统等)中,然后在另一个节点中重新启动,并且该数据对于正常运行至关重要,那么它就不是无状态的。所以无状态并不是严格限制在内存中不保存数据。
有状态服务可以是在客户端访问之间保持状态的任何东西,如果这个状态被破坏,一些请求就会失败。
对于内部有状态但外部无状态的应用程序,事情会变得复杂 API。例如,基于参与者的系统可以称为有状态的(服务相互了解),但如果与持久性参与者状态存储配对,自动故障转移(参与者从死节点迁移到活节点)可以保证可靠性。如您所见,整个服务是有状态的,但通过 API.
的交互是无状态的比这些流行语更重要的是您的应用程序在某些边缘条件下的行为方式:
- 在扩展(添加节点)期间处理现有 processes/sessions/requests
- 处理服务或节点的意外重启或终止
- 在网络分区期间处理请求
- 还有更多类似的...
如果您的服务能够在这些情况下保持一致和高效,那么您就很好了。
"Is it true that if a microservice [has] some persisten[t] storage, that makes it [a] stateful microservice[?]
不,这不是真的。如果这是真的,那么几乎所有微服务都将是有状态的,因为几乎所有微服务都使用某种形式的持久存储。
如果您稍停片刻,以某种距离和不可知论的眼光看待 Web 应用程序,any Web 应用程序,来自从用户的角度来看,您会注意到它 绝对不是 无状态的。 (如果是,那将毫无用处。)至少,它为您提供了一些注册和登录的方式,因此它会记住您,这是持久状态,保存在持久存储中。但是,此 Web 应用程序可能是基于无状态微服务构建的。这些微服务可以访问应用程序的持久状态,但这并不能使它们成为有状态的。
A microservice is called stateful if it maintains some state of its own, and utilizes that state across service requests.
这个状态是否持续是无关紧要的。 (尽管这样更好,否则微服务将面临无法扩展和弹性的危险,这将使其不配被称为“微服务”,但那是另一回事了。)
因此,有状态微服务将在您登录时查询应用程序的主要持久存储以获取有关您的信息,然后只要您保持登录状态就记住该信息,以便保持为您的请求提供服务,而无需在应用程序的主要持久存储中查询每个请求的此信息。
从可用性的角度来看,有状态和无状态微服务的主要区别是:
使用无状态微服务,微服务的任何实例都可以处理来自任何客户端的任何请求。没有“会话”的概念,因此进入场的任何请求都可以路由到任何服务器,以及该服务器内该微服务的任何实例。
使用有状态微服务,您必须在客户端和特定服务器上的特定微服务实例 运行 之间建立会话。进入场并属于该会话的所有服务请求都必须路由到该特定服务器以及该服务器内微服务的特定实例。