gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 00:55:15 26 4
gpt4 key购买 nike

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

但是,与此同时,我想在 sql 数据库中维护购物 list 内容。尤其:

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

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

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

    最佳答案

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

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

  • 如果 DB 或 Actor 与 DB 之间的连接存在问题,或者 DB 本身的负载很高并且处理请求的速度很慢,则 Actor 将无法处理其他请求。 Actor 必须等到转移到 DB 成功完成。
  • 可能使用来自许多参与者的许多单个连接而不是来自另一个实体的一个或多个连接和批量插入来重载数据库。

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

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

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

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

    关于azure-service-fabric - Service Fabric Actors - 将状态保存到数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38395364/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com