多数のオリジナルおよび派生データ ポイントを処理する EventSourcing アプリケーションを実装しています。つまり、コマンドを受け入れる集約ルートPersistentActorとして機能しています。
UpdateValue(name, value, timestamp)
UpdateValue(name, value, timestamp)
UpdateValue(name, value, timestamp)
これらのコマンドが検証されると、永続化されて状態を更新するイベントが生成されます。
ValueUpdated(name, value, timestamp)
ValueUpdated(name, value, timestamp)
ValueUpdated(name, value, timestamp)
では、PersistentViewこれらのイベントをリッスンし、派生値を計算します。
case v @ ValueUpdated("value_i_care_about", _, _) => calculate_derived_values(v)
case v @ ValueUpdated("another_value_i_care_about", _, _) => calculate_derived_values(v)
しかし、この再計算自体は、他のビューが依存する可能性のある新しい値であるため、新しいコマンドを集約ルートに送り返して新しい値を処理する必要があります。ビュー。
ビューがイベントまたはコマンドを生成することは許容されますか? ビューの責任は、イベントやコマンドを生成するのではなく、イベントに基づいて状態を更新することだと思います。また、イベントが到着する順序は、再生中にブロードキャストされる新しいイベントに影響を与える可能性があります。
イベントの代わりにコマンドを生成する必要がありますか? コマンドは初期値を更新していたので、生成されたすべての派生値は、単にコマンドが処理された結果であるイベントであると主張できますが、それらは分散された方法で生成され、集約ルートによって直接生成されるわけではありません。
私は、これらのアクターをつなぎ合わせるために使用できる Akka の Reactive Streams を見てきました。 -part-i-of-ii/ . その投稿で、ジョナサンは次のように述べています。
Sagas はイベントをリッスンしてコマンドをディスパッチし、集合体はコマンドを受信してイベントを発行します。
これらすべてのアクターを FSM として実装することも賢明なアプローチのように思えます: 関連するイベントを 5 秒待ち、すべてを再計算し、コマンドをディスパッチし、イベントを 5 秒待ちます。
物事をもう少し興味深いものにするために、値のストリームは順不同で不完全である可能性がありますが、特定の時点で派生値を生成する必要があります。したがって、値 A と B を受け取った場合:
- A1、B1、B2、A2、B3、A4、B4
派生値を生成する必要があります D:
- D1(A1*B1)、D2(B2*A2)、D3(B3*A2、A3なし)、D4(A4*B4)
これは、順序を追跡しなければならないことを意味し、欠落している値が入ってきた場合は派生値を再発行することがあります.
ありがとう!