適用対象:SQL Server
Azure SQL Managed Instance
この記事では、Service Broker がメッセージをルーティングする方法の詳細について説明します。 概要については、「ルート」を参照してください。
ほとんどのアプリケーションでは、単純な方法で Service Broker のルーティングを正常に利用できます。 サービスを格納する各データベースで、そのサービスが通信する外部サービスへのルートを指定します。 ただし、Service Broker は、アプリケーションで複雑な動作を必要とする場合に対応できる高度なルーティング システムを備えています。 ルーティング プロセスを示す例については、 Service Broker ルーティングの例を参照してください。
プロセスのルート説明
SQL Server には 2 つの異なるレベルのルーティング情報が保持されます。 各データベースには、そのデータベースで開始された会話用のローカル ルーティング テーブル ( sys.routes) が含まれています。 SQL Server インスタンス内で開始されたメッセージ交換の場合、SQL Server は、メッセージ交換を作成したデータベース内のルーティング テーブルを検索します。 インスタンスの外部から受信した会話の場合、SQL Server は msdb.sys.routesを検索します。
基本の照合処理は、メッセージ交換の開始がインスタンスの内部であるか外部であるかにかかわらず同じです。 この処理では、有効期限の切れたルートは無視されます。 ルーティング処理は、次の 3 つの手順で構成されます。
一致するルートを検索する: Service Broker は、サービス名と Service Broker 識別子を照合することで、使用可能な一連のルートを検索します。
ルートの選択: Service Broker は、使用可能な一連のルートの中からルートを選択します。
宛先サービスを見つける: 選択したルートがネットワーク アドレスとして
'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 つが次のように選択されます。
メッセージ交換で Service Broker 識別子を指定している場合、サービス名と Service Broker 識別子の両方が完全一致するルートを検索します。
Service Broker 識別子を指定しないルート間で、サービス名と完全に一致するものを見つけます。
会話で Service Broker 識別子が指定されていない場合は、Service Broker 識別子を指定するルート間でサービス名と完全に一致するものを見つけます。 サービス名は一致するが Service Broker 識別子が異なるルートがルーティング テーブルに格納されている場合、Service Broker 識別子が任意に選択されます。 次に、その Service Broker 識別子を使用するルートのみを照合します。
動的ルーティング サービスへのルートが存在していて、そのサービスへのルートに対して保留中の要求がない場合、このメッセージ交換を遅延と設定し、そのサービスからのルーティング情報を要求します。
サービス名も Service Broker 識別子も指定していないルートを検索します。
メッセージ交換で Service Broker 識別子が指定されていて、インスタンスに、メッセージ交換で指定された名前と一致する名前のサービスを含む 1 つ以上のデータベースが含まれている場合は、ルーティング テーブルにサービス名とネットワーク アドレス
'LOCAL'を含むルートが含まれているかのように会話をルーティングします。このメッセージ交換を遅延と設定します。
メッセージ交換が遅延としてマークされると、Service Broker はタイムアウト期間後に照合プロセスを再度実行します。 一致するルートが見つからない場合は、エラーとは見なされません。
ルートを選択する
照合処理で一致するルートが複数検出された場合は、Service Broker でその中から 1 つのルートが選択されます。 その際、同じ Service Broker 識別子、サービス名、ネットワーク アドレスを持つルートは同一のものと見なされます。 Service Broker で次に示す手順によって適切なルートが選択されます。 各手順で、その手順のアドレス指定に一致するルートがない場合に、引き続き次の手順の処理が行われます。
同じミラー アドレスを指定する複数のルートから 1 つのルートを選択します。
ネットワーク アドレスとして
'LOCAL'を指定するルートの中から 1 つのルートを選択します。 SQL Server のこのインスタンスに、会話で指定された名前と一致するサービスが含まれていない場合は、手順 3 に進みます。同じネットワーク アドレスを指定する複数のルートから 1 つのルートを選択します。
ネットワーク アドレスとして
'TRANSPORT'を指定するルートの中から 1 つのルートを選択します。
ブローカー転送がアクティブでない場合、メッセージ交換が現在のインスタンスで発生せず、選択したルートのアドレスが 'LOCAL'されていない場合、Service Broker はメッセージを削除します。
宛先サービスを見つける
前述のように、Service Broker は、一致するルートがネットワーク アドレスとして 'LOCAL' を指定すると、現在のインスタンスのサービスにメッセージを配信します。 インスタンスの外部から送信されるメッセージの場合、ルートは 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 は、プリンシパルとパートナーが通信できるが、メッセージを送信するインスタンスがプリンシパルに到達できない場合に、確実にメッセージを配信します。