古典的な例は、販売時に注文が入り、イベントが発行される場合です。Finance と Shipping の両方がイベントにサブスクライブされますが、Shipping も Finance からのイベントにサブスクライブされます。

面白いのは、メッセージが到着する順序がわからないことです。データベースがオフラインであるため、販売からのイベントによって技術的なエラーが発生する可能性があります。再度キューに入れられるか、操作が再試行するためにエラー キューに入る可能性があります。その間に、財務からのイベントが到着する可能性があります。したがって、理論的には、販売からのイベントが最初に到着し、次に金融イベントが到着するはずですが、実際にはその逆になる可能性があります。
ここには多くの解決策がありますが、グラフィカルなものは好きではありません。.NET 開発者として、これまで K2 と Windows Workflow Foundation を使用してきましたが、最も柔軟なソリューションは、グラフィカル インターフェイスではなくコードで作成されます。
現在、これには NServiceBus または MassTransit を使用します。ちなみに、私は現在 Particular Software で働いており、NServiceBus を作成しています。NServiceBus には、この種の作業 (ドキュメント) 用の Sagas があります。GitHub のコード。
この用語saga
は一種の負荷がかかりますが、基本的には長時間実行される (ビジネス) プロセスを扱います。Gregor Hohpe はこれをProcess Manager
(リンク) と呼んでいます。
サガが行うことを要約すると、受信メッセージによってインスタンス化され、状態があります。customer id
着信メッセージは、またはなどのcorrelationid に基づいて、特定の saga インスタンスにバインド/ディスパッチされますorder id
。メッセージ (イベント) が処理されると、新しいメッセージが到着するまで、またはコードがサガを完了としてマークし、状態がストレージから削除されるまで、状態が保存されます。
前述のように、.NET の世界では MassTransit と NServiceBus がこれをサポートしていますが、他の環境にはおそらく代替手段があります。