Service Broker のルーティング

このトピックでは、Service Broker がメッセージをルーティングする方法について詳しく説明します。概要については、「ルート」を参照してください。

ほとんどのアプリケーションでは、単純な方法で Service Broker のルーティングを正常に利用できます。サービスを格納する各データベースで、そのサービスが通信する外部サービスへのルートを指定します。ただし、Service Broker では、アプリケーションで複雑な動作を必要とする場合に対応できる高度なルーティング システムを備えています。ルーティングの処理を説明する例については、「Service Broker のルーティングの例」を参照してください。

ルーティング処理の説明

SQL Server は 2 つの別個のレベルのルーティング情報を保持しています。各データベースには、そのデータベース内で開始されるメッセージ交換用のローカル ルーティング テーブル sys.routes が格納されています。SQL Server インスタンス内で開始されたメッセージ交換の場合、SQL Server は、メッセージ交換を作成したデータベース内のルーティング テーブルを検索します。インスタンスの外部で開始されたメッセージ交換の場合、SQL Server は msdb.sys.routes を検索します。

基本の照合処理は、メッセージ交換の開始がインスタンスの内部であるか外部であるかにかかわらず同じです。この処理では、有効期限の切れたルートは無視されます。ルーティング処理は、次の 3 つの手順で構成されます。

  1. 一致するルートの検索。Service Broker は、サービス名と Service Broker の識別子を照合することによって、一連のルートの候補を検索します。

  2. ルートの選択。Service Broker はルートの候補からルートを 1 つ選択します。

  3. 転送先サービスの特定。選択したルートがネットワーク アドレスとして 'LOCAL' を指定している場合、Service Broker はインスタンス内でサービスを検索します。そのサービスがインスタンス内に存在しない場合、Service Broker は手順 2. に戻って別のルートを選択します。

発信側から発信先にメッセージを送信し、発信側が発信先から受信確認メッセージを受け取ると、発信側は受信確認メッセージ内の Service Broker 識別子を使用して、後続のメッセージを同じ発信先にルーティングします。受信確認メッセージは Service Broker によって処理されます。この処理は、Service Broker を使用するアプリケーションに対して透過的です。受信確認メッセージの詳細については、「Service Broker 通信プロトコル」を参照してください。

対象サービスからの応答メッセージ

インスタンスの外部から受け取ったメッセージが発信先サービスからのものである場合、SQL Server は現在のインスタンスがメッセージ内の Service Broker 識別子を保持しているかどうかをチェックします。保持していれば、「転送先サービスの特定」で説明するように、メッセージは現在のインスタンス内に配信されます。保持していなければ、SQL Server は標準的な照合処理を行います。

一致するルートの検索

SQL Server がルートを照合する手順を次に示します。各手順で 1 つ以上のルートが一致した場合に照合処理が終了し、Service Broker は、次の一致したルートから 1 つを選択します。

  1. メッセージ交換で Service Broker 識別子を指定している場合、サービス名と Service Broker 識別子の両方が完全一致するルートを検索します。

  2. Service Broker 識別子を指定していないルートから、サービス名と完全一致するものを検索します。

  3. メッセージ交換で Service Broker 識別子を指定していない場合、Service Broker 識別子を指定しているルートからサービス名と完全一致するものを検索します。サービス名は一致するが Service Broker 識別子が異なるルートがルーティング テーブルに格納されている場合、Service Broker 識別子が任意に選択されます。その後、その Service Broker 識別子を使用するルートのみが照合されます。

  4. 動的ルーティング サービスへのルートが存在していて、そのサービスへのルートに対して保留中の要求がない場合、このメッセージ交換を遅延と設定し、そのサービスからのルーティング情報を要求します。

  5. サービス名も Service Broker 識別子も指定していないルートを検索します。

  6. メッセージ交換で Service Broker 識別子を指定している場合、およびメッセージ交換で指定された名前と一致する名前のサービスを格納しているデータベースが 1 つ以上インスタンスに含まれている場合、そのサービス名とネットワーク アドレス 'LOCAL' を持つルートがルーティング テーブルに含まれているかのように、メッセージ交換をルーティングします。

  7. このメッセージ交換を遅延と設定します。

メッセージ交換が遅延と設定されている場合、Service Broker はタイムアウト期間の経過後に照合処理を再度実行します。一致するルートの検出に失敗した場合エラーと見なされないことに注意してください。

ルートの選択

照合処理で一致するルートが複数検出された場合は、Service Broker がその中から 1 つのルートを選択します。その際、同じ Service Broker 識別子、サービス名、およびネットワーク アドレスを持つルートは同一のものと見なされます。Service Broker は次に示す手順で適切なルートを選択します。各手順で、その手順のアドレス指定に一致するルートがない場合に、引き続き次の手順の処理が行われます。

  1. 同じミラー アドレスを指定する複数のルートから 1 つのルートを選択します。

  2. ネットワーク アドレスとして 'LOCAL' を指定する複数のルートから 1 つのルートを選択します。メッセージ交換で指定された名前と一致するサービスがこの SQL Server インスタンスに含まれていない場合は、手順 3. に進みます。

  3. 同じネットワーク アドレスを指定する複数のルートから 1 つのルートを選択します。

  4. ネットワーク アドレスとして 'TRANSPORT' を指定する複数のルートから 1 つのルートを選択します。

ブローカの転送がアクティブになっていないと、メッセージ交換が現在のインスタンスで開始されたものでなく、選択されたルートのアドレスが 'LOCAL' でない場合に、Service Broker はメッセージを削除します。

転送先サービスの特定

前述のように、一致するルートでネットワーク アドレスとして 'LOCAL' を指定している場合に、Service Broker は現在のインスタンス内のサービスにメッセージを配信します。インスタンスの外部から発信されたメッセージの場合は、msdb.sys.routes 内にルートが存在していなければなりません。インスタンスの内部で発信されたメッセージの場合は、メッセージ交換を開始したデータベースの sys.routes テーブル内に一致するルートが存在しなければなりません。

Service Broker がメッセージ向けのサービスが現在のインスタンス内にあることを確認する場合、Service Broker はインスタンス内のサービスを特定する必要があります。メッセージ交換の Service Broker 識別子がメッセージ交換またはルートに存在する場合、Service Broker は Service Broker 識別子で示されたデータベースにメッセージを配信します。

メッセージ交換またはルートに存在しない場合、Service Broker はサービスを特定するために、まずメッセージ交換を格納しているデータベース内でサービス名を検索します。次にインスタンス内の他のデータベース内でサービス名を検索します。Service Broker は、最初に検出されたサービスにメッセージを配信します。ただし、Service Broker がインスタンス内の他のデータベースを検索する順序は不特定で、メッセージ交換ごとの一貫性は保証されていません。つまり、インスタンス内で対象サービスに複数のコピーが存在する場合、Service Broker は対象となるサービスをランダムに選択します。

その他の注意点

信頼性の向上のため、Service Broker のルーティングはルーティングのループに対する保護手段を備えています。Service Broker のルーティングでは、データベースのミラーリングを検出し、ミラー化されたデータベースのアクティブなパートナーに透過的にメッセージ交換をリダイレクトします。

ルーティングのループ

Service Broker のメッセージ転送では、ルーティングの無限ループを防ぐために、メッセージが転送された回数を追跡します。詳細については、「Service Broker のメッセージ転送」を参照してください。

一致するルートに現在のインスタンスに解決されるネットワーク アドレスが含まれている場合、SQL Server では、メッセージ交換がインスタンスの外部で開始されたかのようにメッセージ交換を取り扱います。Service Broker は、msdb.sys.routes 内のルートを使用してメッセージ交換の各メッセージをルーティングします。各メッセージのルーティングは、インスタンスの外部からのメッセージのルーティングと同じです。特に、Service Broker が 'LOCAL' 以外のネットワーク アドレスにメッセージを転送するには、メッセージ転送がアクティブである必要があります。

ミラー アドレス

ミラー アドレスのルートは、一連の適合するルートからルートを選択する場合に、最高の優先順位を持ちます。ただし、Service Broker は、メッセージ交換に適合するルートを探す際に、ミラー アドレスを特別に優先しません。

Service Broker でミラー アドレスを指定するルートを選択していて、Service Broker がそのルートで以前にメッセージを配信していない場合に、現在どちらのインスタンスがプリンシパルであるか調べるために、Service Broker は両方のアドレスに要求を送信します。Service Broker によってプリンシパルが特定されると、Service Broker はルートを使用するすべてのメッセージをプリンシパル宛てに送信し、ミラー インスタンスには送信しません。プリンシパルに到達できない場合、つまり、そのインスタンスがプリンシパルでなくなったことを示している場合、ペアのもう一方のアドレスの SQL Server インスタンスが新しいプリンシパルであることを示していれば、Service Broker はもう一方のアドレス宛てにメッセージを送信します。

Service Broker がプリンシパルに到達できず、そのパートナーが新しいプリンシパルであることを示していない場合には、Service Broker はパートナーにメッセージを送信しません。このとき、Service Broker は、プリンシパルに到達できるか、パートナーがプリンシパルになったことを示すまで、プリンシパルのアドレスとパートナーのアドレスに対して再試行します。この手法により、プリンシパルとパートナーが通信可能でも、メッセージを送信するインスタンスがプリンシパルに到達できない場合に、Service Broker は信頼性の高い方法でメッセージを配信できます。