2016-09-09 11 views
4

CQRS/ESアーキテクチャの境界付きコンテキスト間の通信は、イベントによって実現されます。コンテキストAはコマンドに対する応答としてイベントを生成し、これらのイベントはイベントバス(メッセージキュー)を介してコンテキストBに転送されます。コンテキスト/イベントストア/プッシュ/プル間のCQRS /通信?

またはイベントストア(コンテキストAに属する)にイベントを格納することができます。 または...両方(店舗フォワード)。

私の質問は:文脈Bから、私はコンテクストストアからのイベントをプルする必要がありますか?または単にイベントバスを介してをプッシュしたイベントを消費しますか?

私は引き上げのアプローチに傾いています。コンテキストBでは、コンテキストBに追いつくことができます。対照的に、プッシュアプ​​ローチでは、コンテキストBは、Bがダウンタイムを経験している間に配信されたイベントを認識しない可能性があります。

だから...イベントストアがあると、メッセージキュー(冗長であるようです)を単に忘れることができますか?

ここに何か不足していますか?

答えて

4

あなたはDDDヨーロッパ会見でConsume event stream without Pub/Sub

検討したいと思う、私は可能な限りパブ/サブを避けスピーカーが、私はここで、(原文のまま)と話をしたことに気づきました。

以下の説明には価値があるかもしれません。 TL; DR:パブ/サブのファンはあまりありません。 Push or Pull?

コンラッドGarus、プル設計記述:後者(およびより単純な)設計で

を、それらが唯一の新しいイベントが(ように、そのシーケンシャルIDとともに、保存されたという情報を広めますすべての予測はどれくらい後ろにあるかを見積もることができます)。起動されると、エグゼキュータはイベントストアを照会することから始まる通常の経路に沿って継続することができます。

なぜですか?単一のソースからのイベントの処理はより簡単ですが、DBバックアップ・イベント・ストアでは順序が保証され、メッセージの紛失や重複には問題がないため、より重要です。プライマリキーで1つのテーブルを順番に読み込み、データがRAMキャッシュに格納されていることを考えると、データベースのクエリは非常に高速です。ボトルネックは、その読み込みモデルデータベースを更新する投影スレッド内にあります。

イベントソーシングについて考えている人は、実際には孤立したイベントではなく、歴史を考えています。あなたが本当に望むのは、ギャップのない順序付けられたイベントシーケンスです。そのシーケンスの権限を照会するのは、複数の不連続なイベントメッセージから再構築しようとするよりはるかに優れています。

しかし、いったんそれを決めると、突然、履歴とその中に現れるすべてのイベントがコンテキストAのAPIの一部になります。チームAが異なるイベントストアの実装がより適切な?彼らは自分のサービスの新しいバージョンを公開することができますか、すべての消費者も更新する必要があるため、大規模な停止が必要ですか?私たちは、コンテキストC、コンテキストDにコンテキストAをリファクタリングすることにした場合

同様に、何が起こりますか?ここでも、私たちが必要とするデータを得るために文脈Bで悩まなければなりませんか?

たぶん、本当の問題は、そのコンテキストBは、コンテキストAでの履歴に結合され、そしてそれらの歴史は本当にプライベートすべきですか?コンテキストBがコンテキストAのデータにアクセスすべきか、あるいはその作業をコンテキストAの機能に委ねるべきか?

のUdi漢​​3210はその方向にあなたの思考をジャンプスタートします。