Service Broker のメッセージ転送

Service Broker のメッセージ転送によって、SQL Server のインスタンスはインスタンス外部からのメッセージを受け付けて、それらを別のインスタンスに送信することができます。

管理者は、メッセージ転送を以下の目的で使用できます。

  • 異なる信用ドメインに属しているサーバー間を接続する。

  • 単一の集中化されたインスタンスを作成し、そこにドメインのルーティング情報を保持することで管理を簡素化する。

  • 複数のインスタンスに作業を分散させる。

転送が有効になっている場合は、msdb.sys.routes 内のルーティング テーブルによって、別のインスタンスから着信したメッセージを転送するかどうかが決定されます。一致するルートのアドレスが LOCAL でない場合は、SQL Server から指定のアドレスにメッセージが転送されます。それ以外の場合は、メッセージはローカルに配信されます。

各 Service Broker メッセージには、最長有効期間と、メッセージが転送された回数を示すカウントが含まれています。インスタンスは、メッセージを転送する際にメッセージ内のカウントを増やします。メッセージの最長有効期間が過ぎると、転送を行うインスタンスによってメッセージが破棄されます。この方法は、ルーティング ループが発生した場合の問題を回避するのに役立ちます。

転送および信頼性のある配信

メッセージを転送するインスタンスは、送信者にメッセージの受信確認を送信しません。最終的な宛先のみが、メッセージの受信確認を送信します。一定期間が過ぎても最終的な宛先から送信者に受信確認が届かなかった場合は、送信者がメッセージを再送信します。

メッセージを転送するインスタンスは、転送されるメッセージを保存する必要がありません。転送されるメッセージは、代わりに、SQL Server によってメモリに保持されます。メッセージ転送に利用できるメモリの量は、Service Broker エンドポイント構成の一部として指定します。この方法によって、効率的でステートレスなメッセージ転送が可能になります。メッセージ転送を実行するインスタンスが異常終了しても、メッセージは失われません。各メッセージは、最終的な宛先からメッセージの受信確認が送信されるまで、送信者側で保持されます。これについては、「Service Broker 通信プロトコル」で説明されています。

管理ビュー sys.dm_broker_forwarded_messages には、インスタンスで現在転送中のメッセージに関する情報が表示されます。インスタンスは、転送中のメッセージを保持しません。これらのメッセージはメモリ内にのみ存在します。メッセージを送信したインスタンス、およびメッセージを受信するインスタンスは、メッセージを保持します。送信元のインスタンスは、受信するインスタンスからメッセージの受信確認が送信されるまでメッセージを削除しません。

セキュリティと転送

Service Broker のメッセージ転送では、転送を行うインスタンスが転送されるメッセージの暗号化を解除する必要がありません。したがって、メッセージ交換に関係するデータベースでのみ、ダイアログ セキュリティを構成しておく必要があります。

ただし、SQL Server インスタンス間の接続にはトランスポート セキュリティが適用されるため、各 SQL Server インスタンスでは、直接通信するインスタンスに対してトランスポート セキュリティが正しく構成されていることが必要です。たとえば、転送を行うインスタンスを介してインスタンス A とインスタンス B が通信する場合は、インスタンス A と B の両方で、転送を行うインスタンスに対してトランスポート セキュリティを正しく構成しておく必要があります。インスタンス A と B は直接メッセージを交換しないので、互いに通信するためのトランスポート セキュリティを構成しておく必要はありません。