26

イベント ストアではなく、CQRS リポジトリがイベントを発行するのはなぜですか? で学んだように。イベントを発行するのは、CQRS リポジトリのタスクです。ここまでは順調ですね。

もちろん、イベントの保存と発行は、1 つのトランザクション内で行う必要があります。技術的には、これは 1 つ (または複数) のレコードをストアに書き込み、1 つ (または複数) のイベントをメッセージ バスに発行することを意味します。したがって、単純なデータベース トランザクションでは十分ではなく、分散トランザクションにする必要があります。

現在、残念ながら、多くの NoSQL データベース (MongoDB など) は ACID 準拠のトランザクションをサポートしておらず、分散トランザクションで発生する可能性についても言及していません。さらに、分散トランザクションをサポートしていないメッセージ キューもあります。

問題は、これにどう対処するかです。

使用する推奨パターンはありますか?

4

1 に答える 1

22

リポジトリはイベントを発行できますが、そうする必要はありません。この場合の解決策は、イベント ストアをキューとして使用することです。イベント ストアで新しいイベントを監視し、それらを (たとえば) バスに発行し、ディスパッチ済みとしてマークするバックグラウンド プロセスを用意します。

いつものように、トレードオフがあります。おそらく、少なくとも 1 回のメッセージングとべき等処理に対処する必要があります。単純な分散トランザクションを使用するよりも複雑です。

Jonathan Oliverは、このトピックについて役立つかもしれないいくつかの投稿を書いています

于 2012-11-21T09:44:42.220 に答える