【问题标题】:Service Fabric Actors - save state to databaseService Fabric Actors - 将状态保存到数据库
【发布时间】:2016-11-18 14:52:44
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: azure-service-fabric


    【解决方案1】:

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

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

    • 如果 DB 或 Actor 与 DB 之间的连接存在问题,或者如果 DB 本身的负载很高并且处理请求的速度很慢,Actor 将无法处理其他请求。演员必须等到转移到 DB 成功完成。
    • 由于来自多个参与者的多个单个连接而不是来自另一个实体的一个或多个连接以及批量插入,可能导致 DB 过载。

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

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

    还有另一件需要考虑的事情——从 DB 中读取。可能,如果您有关系数据库并且将仅使用一个表更新新记录 + 如果会有大量参与者在激活时查询此类数据,那么您将遇到性能下降,因为如果您使用该表将被锁定以进行读取或写入不会将其配置为不同的行为。因此,您可能需要缓存系统来读取参与者激活的数据——这取决于您的工作量。

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

    【讨论】:

      猜你喜欢
      • 2018-03-14
      • 1970-01-01
      • 2018-10-30
      • 2016-04-30
      • 2017-03-26
      • 2012-08-07
      • 2018-11-06
      • 2021-02-01
      • 2016-09-08
      相关资源
      最近更新 更多