Service Fabric Actors - 将状态保存到数据库

fil*_*lip 4 azure-service-fabric

我正在开发一个示例Service Fabric项目,我必须维护一个购物清单.为此我有一个ShoppingList actor,可以通过特定的id识别.它使用StateManager将当前列表内容存储在其状态中.一切正常.

但是,与此同时,我想在sql数据库中维护购物清单内容.特别是:

  • 存储所有添加/删除项目请求以供将来分析(ML)
  • 在第一个actor初始化加载列表内容来自db(例如,在重新创建集群之后)

实现这一目标的最佳方法是什么?创建一个自定义StateProvider(如何?找不到示例)?或者可能有另一个服务/ actor来处理所有数据库操作(可能使用队列和提醒)?

所有示例似乎完全依赖于默认的StateManager,没有数据持久性到外部存储,所以我不确定什么是最佳实践.

cas*_*rad 5

最好的方法是让一个单独的实体负责将数据存储到DB.演员只会发送一个事件(不是暗示SF事件)和一些有关已执行操作的数据,另一个实体将捕获它并执行其余的工作.

但是当然你可以在演员本身实现这个东西,但它会带来两个可能的问题:

  • 如果DB或者actor和DB之间的连接存在一些问题,或者如果DB本身存在高负载并且它将缓慢地处理请求,则Actor将无法处理其他请求.演员必须等到转移到DB成功完成.
  • 可能会因为来自多个actor的许多单个连接而不是来自另一个实体和批量插入的一个或多个连接而导致DB过载.

因此,您的最终解决方案将取决于您系统的工作量.但是,如果此类数据的值太高而无法承受损失,您肯定需要一个可靠的队列来安全地将数据存储在数据库中.

此外,我认为您可以使用默认状态管理器来存储日志和有关事务的信息,然后将其传输到数据库并在事务完成后从服务状态中删除.无需在服务中永久存储此类数据.

还有另外需要考虑的事情 - 从DB读取.也许,如果你有关系数据库,将与新的纪录只有一个表更新+是否会有演员,将查询在激活这样的大数据量,你将有性能下降,因为这表将被锁定为读或写,如果你不会将其配置为行为不同.因此,您可能需要缓存系统来读取演员激活的数据 - 取决于您的工作量.

关于实现自定义状态管理器:看一下这个例子.基本上,您需要做的就是实现IReliableStateManagerReplica接口并将其传递给StatefullService构造函数.