2016-07-15 73 views
4

我工作的一个示例服务Fabric项目,在这里我要保持一个购物清单。为此,我有一个ShoppingList actor,可以通过特定的ID进行标识。它使用StateManager将当前列表内容存储在其状态中。一切正常。服务织物演员 - 保存状态数据库

然而,在并行我想保持在一个SQL数据库的购物清单的内容。特别是:

  • 店内所有添加/删除,供日后分析项目请求(ML)
  • 从DB第一男主角初始化加载列表内容(例如集群已经在重新创建)

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

所有的例子似乎完全依靠默认StateManager,没有数据持久化到外部存储设备,所以我不知道什么是最好的做法。

回答

5

的最佳方式将是有专人负责将数据存储到数据库的独立实体。演员只会发送一个事件(并不意味着SF事件)和一些关于执行操作的数据,另一个实体会捕获它并执行其余的工作。

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

  • 演员将无法处理其他请求是否会有与DB或之间连接的一些问题演员和数据库,或者是否会有高负载的数据库本身,它会缓慢地处理请求。演员将不得不等待转移到数据库成功完成。
  • DB的可能的过载与来自许多行为者,而不是一个或与另一实体和批量插入几个连接许多单个连接。

所以,你的最终解决将取决于你的系统的工作量。但是,如果这些数据的价值太高而不能承受损失,那么您肯定需要一个可靠的队列来安全地将数据存储在数据库中。

另外,我觉得你可以使用默认状态管理器来存储日志和有关交易前将被转移到数据库和事务完成之后,从一个服务的状态中删除。没有必要在服务中永久存储这些数据。

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

并且将其实现您的自定义状态管理器:看看this例子。基本上,所有你需要做的是落实IReliableStateManagerReplica接口,并把它传递给StatefullService构造函数。