Service Fabric - 在StateManager中为可靠的actor存储List <t>

时间:2017-02-26 21:37:50

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

我的一个用例需要在单个事件生成器的“start”和“stop”事件之间存储所有事件。我们将使用可靠的演员来处理这些数据,并在收到“停止”事件后进行总结。在开始和停止之间存储所有事件的直接方式是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将序列化/反序列化整个数组。我的理解是否正确?

什么是这个解决方案的一个很好的替代品?

3 个答案:

答案 0 :(得分:5)

是的,您的理解是正确的。最好的方法是按原样处理状态管理器 - 键值存储,并使用可能是复合的键对不同的流进行分区。

答案 1 :(得分:2)

遵循here的建议:

  

A&#34;保存&#34;可以包括持久化到磁盘和复制,具体取决于   使用的设置。尚未修改的值不是   坚持或复制。如果未修改任何值,则保存   操作无效。

我建议使用像ImmutableList这样的不可变集合而不是列表,否则您的更改最终可能只会在内存中。

答案 2 :(得分:1)

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

  • DeviceActor
  • EventActor

您的设备角色可以接收事件,为每个事件创建一个新的EventActor(存储有关每个事件的详细信息)并将HashSet保持在您的DeviceActor状态,每个EventActor一个。

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