2 つのイベントを生成する書き込みモデル (ドメイン) があるとします。
- CarrierAdded(...)
- BusConnectionCreated(キャリア、...)
Carrier クラスと BusConnection クラスは、別個の集約 (の一部) です。BusConnection は Carrier に割り当てられ、その CarrierId を含みます (個別の集計は ID によってのみ参照されます)。
コマンドとイベントの通常のフローでは、書き込みモデルと読み取りモデルの両方ですべて問題ありませんが、新しい読み取りモデルを最初から再構築/追加する場合に問題が発生します。
多くの人が (akka-persistence ライブラリなど)、イベントはイベント ストアに集約ごとに保存することを提案しています。デノーマライザーがイベントに応答するように要求すると、各集計から 2 つの独立したイベント ストリームを取得します。問題は、上記の例のように、異なる集約からの一部のイベントが、イベント ストアに追加されたのと同じ順序で応答する必要があることです。つまり、何らかの因果関係/部分的な順序付けが必要です。
そして最後に私の質問:
- ドメインの設計を再考する必要があります (集約境界が不適切ですか?) または
- 部分的な順序を強制するだけでよいですか?
後者の場合、それを行う最も効率的な方法は何ですか?
- グローバルカウンター?スケーラブルではないようです。
- ある種のベクトル時計?
- そのような問題が発生したときに、デノーマライザーでそのような問題を検出しますか? たとえば、CarrierId を取得しましたが、この ID を持つ CarrierAdded イベントがまだないため、イベントを隠して、最初に予想されるイベントを待ちます
- 再生モードでイベントを処理するという観点から、いくつかの順序を導入しますか? たとえば、Carriers に関するすべてのイベントが最初で、BusConnection 関連のイベントは後でですか?