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中直接獲取更多信息而不調用它的子方法。