【问题标题】:Service Fabric - storing a List<T> in StateManager for a reliable actorService Fabric - 在 StateManager 中存储 List<T> 以获得可靠的参与者
【发布时间】:2017-07-17 09:43:48
【问题描述】:

我的一个用例需要存储来自单个事件生产者的“开始”和“停止”事件之间的所有事件。我们将使用可靠的参与者来处理这些数据并在收到“停止”事件后进行汇总。在开始和停止之间存储所有事件的直接方式是使用 List 类型。

// Init
var evts = new List<DataEvent>();
this.StateManager.TryAddStateAsync("events", evts);

// Fetch, add and save
var evts = this.StateManager.TryGetStateAsync<List<DataEvent>>("events");
evts.Add(newEvent);
this.StateManager.TrySaveStateAsync("events", evts);

据我了解,每次获取现有列表、添加新项目并存储新更新的列表时,StateManager 都会序列化/反序列化整个数组。我的理解正确吗?

什么是这个解决方案的好选择?

【问题讨论】:

    标签: c# azure-service-fabric service-fabric-stateful service-fabric-actor


    【解决方案1】:

    是的,你的理解是正确的。最好的方法是按原样对待状态管理器 - 键值存储,并通过可以组合的键对不同的流进行分区。

    【讨论】:

    • 感谢您的确认。我的流是分区的,每个参与者将处理一个设备,但是我需要在每个参与者中存储一系列事件才能计算摘要。
    【解决方案2】:

    遵循here的建议:

    “保存”可以包括持久化到磁盘和复制,具体取决于 使用的设置。未修改的值不 持久化或复制。如果未修改任何值,则保存 操作什么都不做。

    我建议使用 ImmutableList 之类的不可变集合而不是 List,否则您的更改最终可能只存在于内存中。

    【讨论】:

    • 这是一个很好的观点。 ATM 我正在​​考虑为每个数组元素设置一个状态键并将元素计数器保持在一个状态。我还将拥有该数组的本地副本,因此我唯一需要逐个元素读取此状态数组的情况是,如果某个参与者由于某种原因被激活。
    【解决方案3】:

    您是否考虑过使用两种演员类型:

    • DeviceActor
    • EventActor

    您的 device-actor 可以接收事件,为每个事件创建一个新的 EventActor(存储有关每个事件的详细信息)并在您的 DeviceActor-state 中保留一个 HashSet,每个 EventActor 一个。

    或者,如果您需要更多信息来过滤事件:字典,或者如果您需要直接在 DeviceActor 中的更多信息而不调用它的子actor,则使用元组。

    【讨论】:

      猜你喜欢
      • 2016-07-26
      • 1970-01-01
      • 2016-07-26
      • 2019-07-08
      • 2017-12-08
      • 2019-04-04
      • 2016-08-09
      • 2019-05-20
      • 2017-12-17
      相关资源
      最近更新 更多