2

私は2種類のイベントを持っています:

  • 人が変わった
  • 人の住所が変更されました。

どちらも、新しい人物 (および新しいアドレス) が作成される (作成または更新のようなもの) ときにも公開されます。

新しい人物が作成されると、PersonChanged と PersonAddressChanged の 2 つのイベントが発行されます (この順序で)。ただし、NServiceBusは非同期であるため、任意の順序で処理できます。また、アドレスが (既存の人の場合) 変更されると、PersonChanged イベントは発生せず、PersonAddressChanged イベントのみが発生します。

私は PersonAddressChanged イベントのハンドラーを書きたいと思います:

  1. その人物がデータベースに存在するかどうかを確認する
  2. はいの場合は、更新するだけです
  3. いいえの場合は、サガを開始し、PersonChanged イベントを待ちます (新しい人物であると仮定します)。

そして、PersonChanged イベントで、人物をデータベースに挿入し、サガを見つけて、PersonAddressChanged のハンドラーをもう一度実行する必要があります。

NServiceBus Sagas でこれを達成できますか? PersonChanged → PersonAddressChanged特定のアドレス変更に対して PersonChanged イベントが発生しない場合があるため、メッセージ処理が正常に行われているとは言えません。

4

3 に答える 3

2

イベントに関するセマンティクスの一部を再考することに関する @carlpett の声明に同意します。

また、ここでサガとは別の解決策を検討することをお勧めします。

PersonAddressChanged メッセージ ハンドラーが、データベースに現在の人物がいないことを確認したときに、取得したアドレスを使用して人物を作成した場合はどうでしょうか。

于 2014-03-04T16:03:45.800 に答える
1

イベントが既存の人にのみ送信される場合PersonAddressChanged、私はサガをまったく気にしません。

代わりに、再試行ロジックに依存して、順不同で到着したメッセージを処理します。

が処理されるときはいつでもPersonAddressChanged、個人レコードが存在すると想定できます。そうでない場合 (つまり、メッセージが順不同で処理されている場合)、ハンドラーは例外をスローし、後で再試行されます。

再度再処理されるまでに、PersonChangedイベントは処理され、すべて問題ありません。

于 2014-03-05T08:43:24.940 に答える