在 Service Fabric Actor 中保持状态
Keeping State in Service Fabric Actors
我正在考虑开始在 Service Fabric 中使用 Actors,但我想在开始之前澄清一些事情。
我有一个 API 接受用户处理一些数据的请求和 returns 一个 ID。来自用户的多个请求在处理过程中不会重叠,并且是完全隔离的,所以我觉得 actors 在这方面效果很好。
但是我想了解的是,将状态本地存储在我根据每个请求创建的每个参与者中然后在 api 查询该数据时存储状态是否是一个好习惯?
我知道 actors 在 "being used" (https://docs.microsoft.com/en-us/azure/service-fabric/service-fabric-reliable-actors-lifecycle) 未激活时会被停用,但仍保持其状态并在对 actor 进行新调用时重新激活。所以从理论上讲,如果每个演员都被分配了相同的 ID 并发送回用户,那么即使演员已被停用,用户也可以返回并查询数据,这不会有任何问题。
这是一个好方法还是我应该让参与者完成工作并将存储卸载到另一个有状态服务?好好弄个pros/cons这个问题的清单。
将 Actors 映射到用户可能是一个很好的方法,只要您的状态被标记为 Persistent
Actor,即使跨 Actor activations/deactivations,状态也会可靠地存储(即复制到其他节点) .一个活动的 Actor 只是意味着它被加载到 ActorService
的工作内存中。如果一个 Actor 被停用并随后被调用,它只会被重新激活。如果您将 ActorId
映射到用户 ID,那么相同的身份可以存储在 Actor 本身中,而不需要辅助数据存储(例如数据库)。
Actor的特点是single-threaded。这意味着对 Actor 和 Actor 状态的访问是按顺序进行的。如果对 Actor 的访问主要是由用户与您的 API 的交互驱动的,那么这应该不是问题。另一方面,如果您有多个服务同时访问您的 Actor,那么这可能会成为您的瓶颈,在这种情况下,您可能需要考虑使用 Reliable Stateful Service 而不是 data/state.
持久化演员
- Single-threaded 访问
- 包含状态
- 按 ActorId 分区
没有状态和单独持久化的Actor
- Single-threaded 访问
- 按 ActorId 分区
- State/data 访问受限于持久性解决方案(SQL 连接池等)
有状态服务
- Multi-threaded 访问
- 按 'manually' 分配的分区键进行分区
- 状态可靠地包含在分区中
无状态服务
- Multi-threaded 访问
- 无分区,多实例
- State/data 访问受限于持久性解决方案(SQL 连接池等)
我正在考虑开始在 Service Fabric 中使用 Actors,但我想在开始之前澄清一些事情。
我有一个 API 接受用户处理一些数据的请求和 returns 一个 ID。来自用户的多个请求在处理过程中不会重叠,并且是完全隔离的,所以我觉得 actors 在这方面效果很好。
但是我想了解的是,将状态本地存储在我根据每个请求创建的每个参与者中然后在 api 查询该数据时存储状态是否是一个好习惯?
我知道 actors 在 "being used" (https://docs.microsoft.com/en-us/azure/service-fabric/service-fabric-reliable-actors-lifecycle) 未激活时会被停用,但仍保持其状态并在对 actor 进行新调用时重新激活。所以从理论上讲,如果每个演员都被分配了相同的 ID 并发送回用户,那么即使演员已被停用,用户也可以返回并查询数据,这不会有任何问题。
这是一个好方法还是我应该让参与者完成工作并将存储卸载到另一个有状态服务?好好弄个pros/cons这个问题的清单。
将 Actors 映射到用户可能是一个很好的方法,只要您的状态被标记为 Persistent
Actor,即使跨 Actor activations/deactivations,状态也会可靠地存储(即复制到其他节点) .一个活动的 Actor 只是意味着它被加载到 ActorService
的工作内存中。如果一个 Actor 被停用并随后被调用,它只会被重新激活。如果您将 ActorId
映射到用户 ID,那么相同的身份可以存储在 Actor 本身中,而不需要辅助数据存储(例如数据库)。
Actor的特点是single-threaded。这意味着对 Actor 和 Actor 状态的访问是按顺序进行的。如果对 Actor 的访问主要是由用户与您的 API 的交互驱动的,那么这应该不是问题。另一方面,如果您有多个服务同时访问您的 Actor,那么这可能会成为您的瓶颈,在这种情况下,您可能需要考虑使用 Reliable Stateful Service 而不是 data/state.
持久化演员
- Single-threaded 访问
- 包含状态
- 按 ActorId 分区
没有状态和单独持久化的Actor
- Single-threaded 访问
- 按 ActorId 分区
- State/data 访问受限于持久性解决方案(SQL 连接池等)
有状态服务
- Multi-threaded 访问
- 按 'manually' 分配的分区键进行分区
- 状态可靠地包含在分区中
无状态服务
- Multi-threaded 访问
- 无分区,多实例
- State/data 访问受限于持久性解决方案(SQL 连接池等)