5

JOliver の Event Storeを使用して、単一のトランザクションで複数の集計を更新することについて質問があります。私が理解しているように、すべての集計には独自のイベント ストリームが必要です。現在、多くのコマンド ハンドラーは 1 つの集計のみをロードし、その集計のみを更新します (つまり、それらの集計のイベントを保存します) が、複数の集計を更新する必要があるコマンド ハンドラーが存在することが想像できます。そしてもちろん、私はそれをトランザクションの方法で行いたいと思っています。

ただし、イベント ストアでそれを行う方法がわかりません。CommitChanges()イベントの格納は、イベント ストリームを呼び出すことによって行われます。更新する集計が複数ある場合、 には複数のイベント ストリームがあるため、 への複数の呼び出しが発生しCommitChanges()ます。これをトランザクション対応にする唯一の方法は、 でラップすることですがTransactionScope、基盤となるストレージ テクノロジがトランザクションをサポートしていない可能性があるため、あまり意味がありません。だから私はこのコードで終わりますが、これは間違いなく私が探しているものではありません:

        Guid aggregateGuid1 = Guid.NewGuid();
        Guid aggregateGuid2 = Guid.NewGuid();
        Guid commitGuid = Guid.NewGuid();

        var stream = store.OpenStream(aggregateGuid1, 0, int.MaxValue);
        stream.Add(new EventMessage() { Body = new MonitorDisabled { MonitorGuid = aggregateGuid1, User = "A" } });
        stream.CommitChanges(commitGuid);

        stream = store.OpenStream(aggregateGuid2, 0, int.MaxValue);
        stream.Add(new EventMessage() { Body = new MonitorEnabled { MonitorGuid = aggregateGuid2, User = "B" } });
        // Can't commit twice with the same commit id, what if fails after first one? No way for the store to know it had to write the second part of the commit.
        stream.CommitChanges(commitGuid);

これは、イベント ストアの使用方法について何かが完全に欠けているように感じさせます。誰か助けてくれませんか?どうもありがとう!

4

3 に答える 3

8

Aggregate は、トランザクション境界を定義します。

クロス集計トランザクションを実行する必要がある場合は、集計を見直して再設計する必要があります。

操作 ( command ) が複数の集約に影響を与え、集約が適切に設計され、ドメイン内の実際の整合性の境界にマップされていることが確実な場合、最終的な整合性が求められている可能性があります。各集約にコマンドを送信するだけで、それぞれに 1 つずつ、合計 2 つのトランザクションが作成されます。結果整合性があなたの場合に適していると思わない場合は、残念ながら、それは製図板に戻っています。

于 2011-11-16T13:21:32.113 に答える
3

ジョン・オリバーの代弁はできませんが、答えは「やらない」だと思います。集約はトランザクション境界です。複数の集計のコミットを調整する必要がある場合は、関連するイベントを実行し、必要に応じて元に戻す、saga のような明示的な調整プロセスが必要です。

于 2011-11-16T13:03:42.717 に答える
0

インフラストラクチャがサポートしている場合、これらのシナリオで分散トランザクションを利用する方が簡単な場合があります。

EventStore を使用した TransactionScope:

デフォルトでは、EventStore は、データベースへの変更をコミットする前に、NServiceBus によって作成されたすべてのアンビエント トランザクションを抑制します。ただし、分散トランザクション (MSMQ、SQL Server、Raven など) をサポートするキューとデータベースを使用している場合は、EventStore の TransactionScopeOption を Required に変更できます。これにより、MSDTC を使用して配布されるアンビエント トランザクションに EventStore が確実に参加し、メッセージ キューとデータベースの同期が維持されます。-ファミコンのドキュメント

RavenDB を使用したクロス ドキュメント トランザクション:

あなたは私の死んだ、冷たい、壊れた手から取引をこじ開けるでしょう - Ayende

于 2011-11-29T16:50:41.010 に答える