2

我的一个用例需要存储来自单个事件生产者的“开始”和“停止”事件之间的所有事件。我们将使用可靠的参与者来处理这些数据并在收到“停止”事件后进行汇总。在开始和停止之间存储所有事件的直接方法是使用 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 将序列化/反序列化整个数组。我的理解正确吗?

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

4

3 回答 3

5

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

于 2017-02-27T05:35:15.513 回答
2

以下建议来自这里

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

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

于 2017-02-27T10:13:09.037 回答
1

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

  • 设备演员
  • 事件演员

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

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

于 2017-04-12T18:34:14.713 回答