2017-04-13 3 views
0

私は現在、イベントソーシング、CQRS

はのは、私がイベントソーシングとCQRSを使用してアプリケーションを持っているとしましょう...問題で立ち往生し、あなたがここにいくつかのアイデアやベストプラクティスを私に役立つことを願っています。私は

  • Iが定義設定、ポットがUIに表示されるべきそこから番号を含む赤ポットを含むグリーンポットを持っています。

自分のアプリケーションの現在の状態が

  • レッドポットで表示される番号が含まれ、計算結果:20
  • 設定10
  • グリーンポット:レッド
  • 結果:10(赤ポットからの値)

私はRed Potサービス、Green PotサービスとSettingsサービスを購読するCalculationサービスを持っています。私はさらに、Calculationサービスを購読して、変更に応じて読み込みモデルを更新するView Updaterサービスを持っています。

  1. グリーンポット:

    は今、次のイベントがで下落している25

  2. 設定:グリーンポット

ビューアップデータサービスは少し忙しい今日と更新で多少の遅延がありますビューモデル

計算サービスは、グリーンポットイベントを処理します。読み取りモデル(まだ赤に設定されている)から設定を取得し、何もしません。

その後、CalculationサービスはSettingsイベントを処理します。リード・リード・モデルからグリーン値(まだ20)を取り出し、新しいイベント(結果:20)を送信します。

その後、View Updaterは両方のイベントを処理して読み取りモデルを更新します。

この場合、私のアプリケーションは一貫していません。

このようなことを処理する方法はありますか?任意のアイデアありがとう:

+0

あなたは 'GreenPotUpdated'、' RedPotUpdated'と 'SettingsChanged'のように、より明示的にするイベントの名前を変更する必要があります –

答えて

1

まず、eventual consistencyの共通理解を共有していることは明らかではありません。マーティンKleppmannのtalk

  • コンバージェンス
  • three ideas

    • 最終的な配達
    • を強調したデータ損失

    次に考えたのは、あなたの計算サービスの設計に競合状態を導入しているように見えるということではありません。 RedPot、GreenPot、およびSettingが個別の集約/ストリームである場合、それらの間に時間バインディングはありません。これらの情報源からの出来事の到着は、本質的に難しいものです。

    のUdi漢は、コアビジネスの行動に違いを作るべきではないタイミングでRace Conditions Don't Exist

    マイクロ秒差を書きました。

    これはコンバージェンスが行われる場所です。メッセージのタイミングが異なっても同じ結果になるようにソリューションを設計する必要があります。これは、しばしば、あなたのモデルに、クロック、時間、そして何らかの形でdefining the interval in which some result is trueのコンセプトを含める必要があることを意味します。

    問題を定義したので、計算サービスによって生成された結果は、履歴を保持するよりもスナップショットをキャッシュすることになります。したがって、問題を考える際には、計算サービスが読み込みモデルの任意のデータを受け入れるべきではなく、消費しているイベントに合わせてデータを受け入れるべきであると考えることです。

    Calculation service: "Hi, I can haz green pot as of event #40?" 
    Read model: "Sorry, no can haz, retry-after: 10 minutes" 
    Calculation service: "OK, I'll try again later." 
    
    1

    サービスは、すべてのイベント(GreenPotUpdated,RedPotUpdatedおよびSettingsChanged)を購読して受信する必要があります。

    Calculationサービスは最終的に一貫性のある読み取りモデルに依存しても問題ありません。代わりに、独自のプライベート状態を維持し、イベントが正しい順序で受信されるようにする必要があります。

    関連する問題