Service Fabric Actors - 将状态保存到数据库
Service Fabric Actors - save state to database
我正在处理一个示例 Service Fabric 项目,我必须在其中维护一个购物清单。为此,我有一个 ShoppingList actor,它可以通过特定的 id 来识别。它使用 StateManager 将当前列表内容存储在其状态中。一切正常。
但是,与此同时,我想在 sql 数据库中维护购物清单内容。特别是:
- 存储所有 add/remove 项目请求以供将来分析 (ML)
- 在第一个 actor 初始化时从数据库加载列表内容(例如,在重新创建集群之后)
实现该目标的最佳方法是什么?创建自定义 StateProvider(怎么做?找不到示例)?
或者可能有另一个 service/actor 来处理所有数据库操作(可能使用队列和提醒)?
所有示例似乎都完全依赖默认的 StateManager,没有数据持久化到外部存储,所以我不确定什么是最佳实践。
最好的方法是让一个单独的实体负责将数据存储到数据库。 actor 将只发送一个事件(不暗示 SF 事件)和一些关于执行操作的数据,另一个实体将捕获它并执行其余的工作。
但是你当然可以在actor本身实现这个东西,但是会带来两个可能的问题:
- 如果 DB 或 actor 与 DB 之间的连接出现问题,或者如果 DB 本身的负载很高并且它将缓慢处理请求,Actor 将无法处理其他请求。演员必须等到转移到数据库成功完成。
- 可能使用来自许多参与者的许多单个连接而不是来自另一个实体的一个或多个连接来重载数据库,并且批量插入。
因此,您的最终解决方案将取决于系统的工作负载。但是,如果此类数据的价值太高而无法承受损失,您肯定需要一个可靠的队列来安全地将数据存储在数据库中。
此外,我认为您可以使用默认状态管理器来存储日志和有关事务的信息,然后将其传输到数据库并在事务完成后从服务状态中删除。无需在服务中永久存储此类数据。
还有另一件事要考虑——从数据库中读取。可能,如果你有关系数据库并且只会用新记录更新一个 table + 如果有大量的参与者会在激活时查询这些数据,那么你的性能会下降,因为这个 table 会如果您不将其配置为不同的行为,则被锁定以进行读取或写入。因此,您可能需要缓存系统来读取 actors 激活的数据——取决于您的工作量。
关于实现自定义状态管理器:查看 this 示例。基本上,您需要做的就是实现 IReliableStateManagerReplica
接口并将其传递给 StatefullService
构造函数。
我正在处理一个示例 Service Fabric 项目,我必须在其中维护一个购物清单。为此,我有一个 ShoppingList actor,它可以通过特定的 id 来识别。它使用 StateManager 将当前列表内容存储在其状态中。一切正常。
但是,与此同时,我想在 sql 数据库中维护购物清单内容。特别是:
- 存储所有 add/remove 项目请求以供将来分析 (ML)
- 在第一个 actor 初始化时从数据库加载列表内容(例如,在重新创建集群之后)
实现该目标的最佳方法是什么?创建自定义 StateProvider(怎么做?找不到示例)? 或者可能有另一个 service/actor 来处理所有数据库操作(可能使用队列和提醒)?
所有示例似乎都完全依赖默认的 StateManager,没有数据持久化到外部存储,所以我不确定什么是最佳实践。
最好的方法是让一个单独的实体负责将数据存储到数据库。 actor 将只发送一个事件(不暗示 SF 事件)和一些关于执行操作的数据,另一个实体将捕获它并执行其余的工作。
但是你当然可以在actor本身实现这个东西,但是会带来两个可能的问题:
- 如果 DB 或 actor 与 DB 之间的连接出现问题,或者如果 DB 本身的负载很高并且它将缓慢处理请求,Actor 将无法处理其他请求。演员必须等到转移到数据库成功完成。
- 可能使用来自许多参与者的许多单个连接而不是来自另一个实体的一个或多个连接来重载数据库,并且批量插入。
因此,您的最终解决方案将取决于系统的工作负载。但是,如果此类数据的价值太高而无法承受损失,您肯定需要一个可靠的队列来安全地将数据存储在数据库中。
此外,我认为您可以使用默认状态管理器来存储日志和有关事务的信息,然后将其传输到数据库并在事务完成后从服务状态中删除。无需在服务中永久存储此类数据。
还有另一件事要考虑——从数据库中读取。可能,如果你有关系数据库并且只会用新记录更新一个 table + 如果有大量的参与者会在激活时查询这些数据,那么你的性能会下降,因为这个 table 会如果您不将其配置为不同的行为,则被锁定以进行读取或写入。因此,您可能需要缓存系统来读取 actors 激活的数据——取决于您的工作量。
关于实现自定义状态管理器:查看 this 示例。基本上,您需要做的就是实现 IReliableStateManagerReplica
接口并将其传递给 StatefullService
构造函数。