1

2 つ以上のメッセージによって開始される NServiceBus 5.x の Saga の設計に関するヘルプを探しています。これは、サガが単一のメッセージで開始されるのではなく、サガが開始される前にすべてのメッセージが存在する必要があることを意味します。

それがどのように機能するのかよくわかりません。サンプルや例はどこにもありません。

私はいくつかのメッセージで物語が始まるのは全く問題ないと明言している本を何冊か読みました。

私が得られないのは、たとえば、サガを開始するために 3 つのメッセージが必要な場合に、サガがどのように見つかるかということです。サガが「開始」される前に、3 つのメッセージすべてが任意の順序で到着する必要があります。これは属性の選択にどのように影響しますか?[Unique]

例:「StoreID」、「ComputerID」、「UserID」の 3 つの ID によって「一意に」識別される saga が必要です。これら 3 つの ID は、3 つの異なるコマンド 、Message1Message2で到着しますMessage3

public class MySaga : Saga<MySagaData>, 
IAmStartedByMessages<Message1>, 
IAmStartedByMessages<Message2>, 
IAmStartedByMessages<Message3>
{ ...
}

MySagaData の 3 つのプロパティに [Unique] 属性を設定する必要がありますか?

public class MySagaData
{
    [Unique]
    public int StoreId {get;set;}
    [Unique]
    public int ComputerId {get;set;}
    [Unique]
    public int UserId {get;set;}
}

または、これら 3 つを連結する読み取り専用プロパティを作成する必要がありますか?

到着するMessage1Message3、物語は開始できません。Message2不足している。

それから別の人Message1が到着します。

そしてMessage2到着。(最初のサーガを完了し、開始できるようにします)

2番目はMessage1どうですか?

これはどのように処理されますか?

4

3 に答える 3

3

受信した Saga 実装によって処理されるすべてのメッセージは、その Saga の 1 つのインスタンスのみに属します。これら 3 つのメッセージを同じ Saga インスタンスに関連付けるために、これらの 3 つのメッセージのそれぞれになんらかの方法が必要です。

私はあなたのプロセスを再検討し、これら 3 つのエンティティの 3 つの組み合わせを結び付けて、サガを一意に識別するもの、たとえばオーダーを見つけます。

この後、Saga は 3 つのメッセージをすべて受信するまで待ってから、3 つの ID がすべて設定されていることを確認してから、Saga が必要とする処理を実行します。

于 2016-09-15T14:52:35.847 に答える
1

サガは、あなたが説明しているパターンをサポートしていません。IAmStartedByMessages ディレクティブは、ALL ではなく ANY セマンティックで適用されます。

大きく分けて、2 つのオプションがあります。

  1. 必要なメッセージの 1 つを使用して saga インスタンスを開始し、送信されたときに他のメッセージの到着を処理するか、または
  2. サガが呼び出される前のある時点でAggregatorパターンを実装すると、明らかに複数のメッセージを待機する必要がなくなります。
于 2016-09-15T10:47:01.570 に答える
0

サガを始める行為がサガのように思えます。メッセージのコレクションを管理するために saga を作成し、別の saga を開始してそれらのメッセージの到着を待っている作業を実行するとどうなるでしょうか。

于 2016-09-15T13:04:58.370 に答える