2

シナリオ: 10 ステップのサガを作成しました。さまざまなシステムを更新しており、サガ全体が完了するまでに数分かかる場合があります.

物語は、ユーザーが顧客に関する情報を入力する別のシステムからのデータから始まります。

ユーザーがシステムにデータを入力し終わったときはわかりませんが、x 分ごとに変更されたデータをシステムから読み取っています。

私の問題は、顧客に関するデータを使用してサガを開始するたびに、同じ顧客に関する以前のサガが終了していることを確認する必要があることです。ユーザーがデータの入力に 10 分を費やしている場合、システムは同じ顧客に対して 5 つのフローを開始し、フローが前のフローを追い越してデータを台無しにする可能性があります。

これを解決する方法を知っている人はいますか?

前もって感謝します。

オーレ

4

2 に答える 2

0

これは、saga と、おそらくクライアント システムによって送信されているメッセージを変更せずに解決することはできません。

問題は、ユーザーが顧客に変更を加えるたびに、クライアント アプリケーションによって生成される特定のメッセージ タイプの受信時にサガが開始されるように構成されている可能性があることです。

このメッセージを呼び出しましょう:

public class ClientTypedSomethingAboutCustomer 
{
    int CustomerId {get;set;}
    ...
}

サガは次のように設定されます。

public class CustomerSaga : Saga<CustomerSagaData>, IAmStartedByMessages<ClientTypedSomethingAboutCustomer>
{
    public override void ConfigureHowToFindSaga()
    {
        ConfigureMapping<ClientTypedSomethingAboutCustomer>
            (message => message.CustomerId).ToSaga(saga => saga.CustomerId);
        ...
    }
    ...
}

これにより、サガが初期化され、受信したクライアント メッセージごとに IContainSagaData 実装で Customer ID 値が設定されます。

新しいサガを初期化する追加のメッセージの問題を解決するには、別のメッセージ タイプを作成して、誰かが顧客について何かを入力し始め次にその顧客について別のことを入力するタイミングを区別することができます。

何かのようなもの:

public class ClientTypedSomethingElseAboutCustomer 
{
    int CustomerId {get;set;}
    ...
}

次に、サガは次のようになります。

public class CustomerSaga : Saga<CustomerSagaData>, IAmStartedByMessages<ClientTypedSomethingAboutCustomer>
    ,IHandleMessages<ClientTypedSomethingElseAboutCustomer>
{
    public override void ConfigureHowToFindSaga()
    {
        ConfigureMapping<ClientTypedSomethingAboutCustomer>
            (message => message.CustomerId).ToSaga(saga => saga.CustomerId);

        ConfigureMapping<ClientTypedSomethingElseAboutCustomer>
            (message => message.CustomerId).ToSaga(saga => saga.CustomerId);
    }
    ...
}

これにより、顧客に関するすべてのメッセージが単一の saga インスタンスにルーティングされるようになります。

NServiceBus をシングル スレッド モードで実行することにより、おおよそのキューイング動作を実現できる場合があります。これにより、顧客の同時サガの作成が制限される可能性がありますが、これに依存したくありません。

于 2016-01-04T17:01:59.643 に答える
0

@janpieter_z と @tom-redfern の両方が正しいです。サガを何らかの顧客 ID にマップできることを確認してください。

入ってくるメッセージに対応する正しいサガを見つけるために、複雑なサガ検索ロジックを実装することもできます。

また、複数のメッセージが適切な順序で到着しない場合は、「IAmStartedByMessages」として設定できます。

最後に、あなたの物語にメッセージを送っているのは誰ですか? サガは、データを収集するためのリクエストを送信する責任を負うべきではありませんか? おそらく、タイムアウトなどを介して 10 秒ごとに、数分間何も受信されないか、ハンドラーが別のメッセージで応答するまで?

于 2016-01-05T07:59:19.477 に答える