1

私の使用事例の1つでは、単一のイベントプロデューサからの「開始」イベントと「停止」イベントの間にすべてのイベントを格納する必要があります。信頼できる俳優を使用してこのデータを処理し、「停止」イベントが受信された後に要約します。開始と終了の間にすべてのイベントを格納する単純な方法は、タイプListです。サービスファブリック - 安定した俳優のためにリスト<T>をStateManagerに保存

私の理解から
// 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

はい、ご理解ください。最善のアプローチは、状態管理者をそのまま扱うことです(キー値のストレージ)。コンポジット可能なキーで異なるストリームを分割します。 hereから

+0

確認していただきありがとうございます。私のストリームは分割され、各アクタは1つのデバイスを処理しますが、要約を計算するには、各アクタに一連のイベントを保存する必要があります。 – maulik13

1

次の推奨事項:

「保存」、ディスクおよび複製に持続使用 設定によっては含めることができます。変更されていない値は、 が保持または複製されていません。値が変更されていない場合は、保存 操作は何も行いません。

リストの代わりにImmutableListのような不変のコレクションを使用することをお勧めします。変更がメモリのみになる可能性があります。

+0

それは非常に良い点です。 ATM配列要素ごとに1つの状態キーを持ち、要素カウンタを状態に保つことを考えています。私は配列のローカルコピーも持っているので、何らかの理由でアクターがアクティブ化されている場合は、この状態配列要素を要素で読み取る必要がある唯一の時間です。 – maulik13

0

次の2つの俳優・タイプを使用して考えがあります:

  • DeviceActor
  • EventActor

お使いのデバイスの俳優は、店舗詳細な情報を(イベントごとに1新しいEventActorを作成し、イベントを受け取ることができます各イベントについて)、DeviceActor状態のHashSetをEventActorごとに1つずつ保持します。

また、ディクショナリ上のイベントをフィルタリングするための情報が必要な場合は、ディクショナリを呼び出さずに直接DeviceActorで詳細情報が必要な場合はタプルを使用してください。

関連する問題