シナリオ:NServiceBus - 異なるスレッド/プロセスでBus.Send()が発生したときのメッセージハンドラの順序を制御する方法は?
NServiceBus経由で監査メッセージを送信するシナリオがあります。ハンドラは既存のデータベーステーブルに行を挿入して更新しますが、変更は不要です。監査データに正しいシステム状態が反映されるように、メッセージの処理順序を制御する必要があります。順不同で処理されたメッセージは、監査データに誤った状態が反映される可能性があります。
監査データの中には特定の順序が想定されているものもありますが、プロセス中に何度も送信される状態更新など、最初のメッセージの後にいつでも受信できるものもあります。私は次のように構成されたエンドポイントを持つサーバー、(特にISpecifyMessageHandlerOrdering機能)を使用してテストしてきた私のテストプロジェクトで
:
public class MyServer : IConfigureThisEndpoint, AsA_Server, ISpecifyMessageHandlerOrdering
{
public void SpecifyOrder(Order order)
{
order.Specify(First<PrimaryCommand>.Then<SecondaryCommand>());
}
}
メッセージの明示的な順序が知られていないので、一つのメッセージ、 InitialAuditMessageは最初のメッセージで、PrimaryCommandから継承します。
後で受信できる他のメッセージは、SecondaryCommandから継承します。
public class StartAuditMessage : PrimaryCommand
public class UpdateAudit1Message : SecondaryCommand
public class UpdateAudit2Message : SecondaryCommand
public class ProcessUpdateMessage : SecondaryCommand
これは、同じスレッドから送信されたメッセージの処理順序を制御する際に機能します。
ただし、メッセージが別のスレッドまたはプロセスから送信された場合、これは機能しません。これは、関連するメッセージをリンクするものがないため意味があります。
メッセージを別のスレッドから送信したときに順不同で処理されないように、何らかのIDのようにメッセージをリンクするにはどうすればよいですか?これはSagasのユースケースですか?
また、ステータス更新メッセージに関しては、同じタイプのメッセージが送信された順に処理されるようにするにはどうすればよいですか?
監査行に何らかの種類のタイムスタンプがありますか?そのスタンプに基づいて行を選択したり並べ替えたりすることができます。 –
不幸なことに、この表を変更することはありません。 – gb2d