1

我的一个用例需要存储来自单个事件生产者的“开始”和“停止”事件之间的所有事件。我们将使用可靠的演员来处理这些数据,并在收到“停止”事件后进行总结。在开始和停止之间存储所有事件的直接方式是在List类型中。服务结构 - 在StateManager中为可靠的演员存储列表<T>

// 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

是的,你的理解是正确的。最好的方法是按照原样对待状态管理器 - 关键值存储,并通过可能是复合键的键来划分不同的流。

+0

感谢您的确认。我的流被分区,每个演员将处理一个设备,但是我需要在每个演员中存储一系列事件以便能够计算摘要。 – maulik13

1

here以下建议:

“保存”可以包括持续到磁盘和复制,这取决于 使用的设置。没有被修改的值不是 持久或复制。如果没有值被修改,则保存 操作不执行任何操作。

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

+0

这是一个很好的观点。 ATM我想每个数组元素有一个状态键,并保持元素计数器处于一个状态。我也会有一个数组的本地副本,所以我只需要按元素读取这个状态数组元素就是因为某种原因激活了一个actor。 – maulik13

0

你有没有考虑过用两位男主角类型:

  • DeviceActor
  • EventActor

您的设备,演员能接受的事件,每个事件创建一个新的EventActor(设有专卖店详细信息关于每个事件)并将HashSet保留在您的DeviceActor状态中,每个EventActor一个。

或者,如果您需要更多信息来过滤以下事件:词典或元组,如果您需要在DeviceActor中直接获取更多信息而不调用它的子方法。