6

CQRS + ES を使用しています。ES は NEventStore (以前の JOliver EventStore) です。異なるコマンドに 2 つの集計があります。2 番目の AR の射影は、読み取りモデルの最初の AR 射影によって書き込まれたデータに依存します。問題は、ソフトウェアを実行するとすべてが高速になり、2 つの集計が同じ日時 (列 CommitStamp) でイベント ストアに保持されることがあるということです。イベントを再生すると、CommitStamp 列の順序で最初から取得されます。ただし、2 つのストリームが同一の CommitStamp であり、間違った順序で取得された場合、読み取りモデルの予測は例外で失敗します。

この問題を解決する方法はありますか?

===============================

github https://github.com/NEventStore/NEventStore/issues/170でのこの問題に関する議論は次のとおりです 。

===============================

EDIT : これは現在、イベントを再生する方法です。GetFrom(...) の仕組みを調べたところ、 commitstamp 列が順序付けに使用されていないことがわかりました。やはりコミット順はありません。そのため、イベントの再生を開始すると、今日のイベント、次は 2 年前に記録されたイベント、次などのイベントが返される場合があります。

public void ReplayEvents(Action<List<UncommittedEvent>> whatToDoWithEvents, DateTime loadEventsAfterDate)
    {
        var eventPortion = store.Advanced.GetFrom(loadEventsAfterDate);

        var uncommitedEventStream = new UncommittedEventStream();
        foreach (var commit in eventPortion)
        {
            foreach (var eventMessage in commit.Events.ToList()))
            {
                uncommitedEventStream.Append(new UncommittedEvent(eventMessage.Body));
            }
        }
        whatToDoWithEvents(uncommitedEventStream.ToList());
    }
4

3 に答える 3

3

NEventStore では、一貫性の境界はストリームです。バージョン 3.2 以降 (@Marijn が言及したように、問題 #159 ) CommitSequence 列は、すべての永続化エンジンにわたってストリームから読み取るときに、CommitMessages (およびそこに含まれる EventMessages) を順序付けるために使用されます。

EventMessage の順序は、ストリームごとに保証されます。ストリームでのメッセージの暗黙的な順序付けはありません。選択された永続化エンジンの一部の側面の結果として発生する可能性のある実際の順序付けは偶発的なものであり、依存してはなりません。

ストリーム間での順序付けを保証すると、ライブラリの分散に適した側面が大幅に制限されます。そのような機能を検討したとしても、サポートされているすべての永続化エンジン (NoSQL ストアを含む) で動作する必要があります。

各ストリームが集約ルートを表すドメイン駆動設計を実践しており、2 つ以上の集約での順序付けを保証する必要がある場合、これはドメイン モデルの設計上の問題を示しています。

プロジェクションで複数のソース (ストリーム) からの値をマージする必要がある場合は、ソース内の順序付けに頼ることができますが、ソース間の順序付けには柔軟性が必要です。また、特に外部バスまたはキューを介して再生している場合は、メッセージが重複する可能性も考慮する必要があります。

タイムスタンプ (CommitStamp) を使用して受信側で複数のストリームを並べ替えようとすると、脆弱になります。タイムスタンプの解像度は固定されています (ミリ秒、ティックなど)。ライターが 1 人であっても、「同時に」発生する可能性があります。

于 2013-07-08T13:07:59.187 に答える
1

Damian は、データベースにチェックポイント列を追加しました。これは現在の master ブランチにあります。結果とともに再生されたイベントGetFromCheckpoint(int)が正しい場合。

于 2013-11-13T23:06:45.063 に答える
0

データベース レベルでは、CommitStamp はフィルタリングに適していますが、CommitSequence 列は順序付けをガイドする必要があります。

それについては、使用しているライブラリのバージョンに関係なく、API 呼び出しに関して言えば、演習として残します (または、コード スニペットやバージョンの言及を記入する場合)。おそらく他の誰かが介入することができます)

于 2013-07-05T12:07:16.103 に答える