トポロジの簡単な概要:
nServiceBus サーバーにコマンドを送信する Web サイト。nServiceBus サーバーはコマンドを受け取り、正しい pub/sub イベントを発行します。このサービスには、コマンドに応答して DB に対して何らかの処理を実行できるメッセージ ハンドラーもあります。たとえば、次のようになります。
1 ユーザーが Web サイトに登録します。 2 Web サイトは nServicebus コマンドを別のサーバーの nServicebus サービスに送信します。3 nServicebus サーバーには、その特定のタイプのコマンドのハンドラーがあり、データベースに何かを記録し、ウェルカム メールを送信します。
このアーキテクチャを導入して以来、DB でデッドロックが発生し始めました。データベースサーバーのMSDTCまで追跡しました。データベース サーバーでそのサービスをオフにすると、nServicebus がエラーをスローし始めます。これは、nServiceBus がトランザクションに DB 更新を登録していることを示しています。
私はこれが発生することを望んでいません。DB の障害を自分で処理したいのですが、メッセージが nServicebus プロキシ サービスに確実に配信されるようにするトランザクションのみが必要です。Web から 2 つのサーバーを経由して DB に戻ってトランザクションを行う必要はありません。
助言がありますか?
編集: この投稿はいくつかの手がかりを提供しますが、それが適切な続行方法であるかどうかは完全にはわかりません.. NServiceBus - メッセージ ハンドラーでの TransactionScopeOption.Suppress の使用に関する問題
EDIT2: DB をトランザクションの範囲外で動作させたい理由は、これらのコマンドを別のサーバーで「非同期に」処理して、Web サイトの速度を低下させたり、ユーザーがこれらの長い間待機したりしないようにするためです。集約コマンドの実行。DB がトランザクションの範囲内にある場合、元のコマンドがディストリビューターに送信された時点で Web サイトでの実行がブロックされますか? このシナリオに適した nServicebus アーキテクチャはありますか? コマンドをすばやく起動して Web サイトに制御を戻すことで、ユーザーはすぐに先に進み、集計カウントの更新や電子メールの送信などの長時間実行される DB コマンドを待つ必要がなくなります。