現在、CQRS ベースのプロジェクトをセットアップしています。各 Web プロジェクト インスタンスは NEventStore を実行しますが、すべて同じ EventStore 永続性 (基礎となるデータベース) を共有します。
ここで、保存されたイベントを発行したいと思います。ReadModel (Web プロジェクト インスタンスごとに 1 つ) だけでなく、追加のイベント コンシューマ (たとえば、システムから何らかの方法でイベントを通知する必要があるレガシー アプリケーションなど) にも発行します。もっと)。
したがって、x 個のイベント コンシューマー (= イベント ハンドラー) と y 個のイベント パブリッシャーがありますが、イベントの「実際のソース」は 1 つだけです (基になる EventStore データベース)。
Q1:パブリッシュ/サブスクライブを介してこれらのシステムを接続するためのベスト プラクティスはありますか?
NServiceBus を介して EventStore からイベントを発行することを考えました。すべてのコンシューマーは、必要なイベント タイプをサブスクライブする必要があります。したがって、各コンシューマーも、おそらく複数のパブリッシャーでサブスクライブする必要があります。Q2 : これは可能ですか? 複数の場所で同じイベントをサブスクライブできないことを読みました。次を参照してください: David Boike 「QueueName@WebServer1 で Message1 をサブスクライブすると、QueueName@WebServer2 からの Message1 をサブスクライブすることもできなくなります。」
その他の未解決の質問: Q3:コンシューマーが完全にシャットダウンされたことを検出する方法 (バスからのサブスクライブが正常に解除されていない場合)。-> キューがいっぱい!? これを、ネットワーク接続が少しだけ失われた状況と区別する方法は?
Q4:サブスクリプション サービスと EventStore の間の接続が不安定で失敗した場合はどうなりますか? コンシューマはサブスクリプション サービスに正常に登録されますが、EventStore は新しいサブスクリプションを認識せず、メッセージを配信しません...
Q5:一般に: NServiceBus はキューをどのように処理しますか? 消費者が長時間 (たとえば、数日) 連絡が取れない場合はどうなりますか?