Service Broker のルーティングの例

このセクションでは、Service Broker のルーティング処理の例を示します。各例には AdventureWorks および msdb のサンプル ルーティング テーブルが含まれ、それぞれの例では、Service Broker がこれらのルーティング テーブルを使用してどのようにメッセージのルートを選択するかについて説明します。

このトピックに示すルーティング テーブルは、sys.routes カタログ ビューを単純化したものです。ルート ID と所有者はルーティング処理では重要ではなく、すべてのルートの有効期限は無期限とみなされます。

remote_service_name 列の NULL の値は、どのサービス名とも一致します。broker_instance 列の NULL の値は、どの Service Broker 識別子とも一致します。

送信メッセージの例では、msdb のルーティング テーブルは使用せず、受信メッセージおよびメッセージ転送の例では、AdventureWorks のルーティング テーブルは使用しません。

例 1: 既定の構成

この例では、Service Broker ルーティングの既定の構成について説明します。既定では、master を除くすべてのデータベースに AutoCreatedLocal ルートが含まれます。このため、AdventureWorks および msdb のルーティング テーブルには、次の情報が含まれます。

AdventureWorks.sys.routes

name remote_service_name broker_instance address mirror_address

AutoCreatedLocal

NULL

NULL

LOCAL

NULL

msdb.sys.routes

name remote_service_name broker_instance address mirror_address

AutoCreatedLocal

NULL

NULL

LOCAL

NULL

この場合、AdventureWorks で作成されたすべてのダイアログは、現在のインスタンス内の 1 つのサービスに配信されます。また、インスタンスの外部から受信するすべてのダイアログも、現在のインスタンス内の 1 つのサービスに配信されます。

AdventureWorks で作成されたメッセージ交換の場合、AutoCreatedLocalAdventureWorks.sys.routes での唯一のルートになります。そのルートは一致するルート セット内の唯一のルートであるため、Service Broker はそのルートを選択します。メッセージのサービスがローカル インスタンス内に存在しない場合、メッセージは削除されます。

このプロセスは、インスタンスの外部から受信するメッセージ交換の場合でも同じです。インスタンスの外部から受信するメッセージ交換の場合は、AutoCreatedLocal が、msdb.sys.routes での唯一のルートになります。そのルートは一致するルート セット内の唯一のルートであるため、Service Broker はそのルートを選択します。メッセージのサービスがローカル インスタンス内に存在しない場合、メッセージは削除されます。

例 2: 特定のサービスへのネットワーク ルート

この例では、現在のインスタンスの外部のサービスに対する一般的なルーティング構成を説明します。外部サービスに対するルートを構成するには、メッセージ交換を開始するデータベースにルートを作成します。この例では、AdventureWorksOrderParts サービスのルートが含まれます。このルートには、OrderParts サービスのネットワーク アドレスが含まれています。

AdventureWorks.sys.routes

name remote_service_name broker_instance address mirror_address

AutoCreatedLocal

NULL

NULL

LOCAL

NULL

OrderPartsRoute

OrderParts

NULL

tcp://host2.Adventure-Works.com:4022/

NULL

msdb.sys.routes

name remote_service_name broker_instance address mirror_address

AutoCreatedLocal

NULL

NULL

LOCAL

NULL

この例では、OrderParts サービスに対して AdventureWorks データベースに作成されたすべてのダイアログが、ルート OrderPartsRoute と一致します。Service Broker はこれらのメッセージをネットワーク アドレス tcp://host2.Adventure-Works.com:4022/ に送信します。他のメッセージ交換はすべて同じインスタンス内のサービスに配信されます。

対象のサービスを OrderParts とする AdventureWorks に作成されたメッセージ交換の場合、OrderPartsRoute ルートがサービス名と正確に一致するため、一致するルート セットにはこのルートが含まれます。OrderPartsRoute は、一致するルート セット内の唯一のルートであるため、Service Broker はそのルートを選択します。

別の対象サービスに対して AdventureWorks に作成されたメッセージ交換の場合は、一致するルート セットに AutoCreatedLocal が含まれます。これは一致するルート セット内の唯一のルートであるため、Service Broker はそのルートを選択します。メッセージのサービスがローカル インスタンス内に存在しない場合、Service Broker はこのメッセージ交換に DELAYED のマークを付けます。

インスタンスの外部から受信するメッセージ交換の場合は、AutoCreatedLocal が、msdb.sys.routes での唯一のルートになります。そのルートは一致するルート セット内の唯一のルートであるため、Service Broker はそのルートを選択します。メッセージのサービスがローカル インスタンス内に存在しない場合、メッセージは削除されます。

例 3: ミラー化データベースへのネットワーク ルート

この例では、現在のインスタンスの外部のミラー化データベースでホストされるサービスに対する一般的なルーティング構成を説明します。外部サービスに対するルートを構成するには、メッセージ交換を開始するデータベースにルートを作成します。この例では、AdventureWorksOrderParts サービスのルートが含まれます。ルートには、OrderParts サービスのネットワーク アドレスとミラー アドレスの両方が含まれます。

AdventureWorks.sys.routes

name remote_service_name broker_instance address mirror_address

AutoCreatedLocal

NULL

NULL

LOCAL

NULL

OrderPartsRoute

OrderParts

NULL

tcp://partner1.Adventure-Works.com:4022/

tcp://partner2.Adventure-Works.com:4022/

msdb.sys.routes

name remote_service_name broker_instance address mirror_address

AutoCreatedLocal

NULL

NULL

LOCAL

NULL

対象のサービスを OrderParts とする AdventureWorks に作成されたメッセージ交換の場合、OrderPartsRoute ルートがサービス名と正確に一致するため、一致するルート セットにはこのルートが含まれます。OrderPartsRoute は、一致するルート セット内の唯一のルートであるため、Service Broker はそのルートを選択します。Service Broker はアドレスとミラー データベースの両方をチェックして、プリンシパルとなるパートナーを確認してから、メッセージをそのプリンシパルに送信します。

別の対象サービスに対して AdventureWorks に作成されたメッセージ交換の場合は、一致するルート セットに AutoCreatedLocal が含まれます。これは一致するルート セット内の唯一のルートであるため、Service Broker はそのルートを選択します。メッセージのサービスがローカル インスタンス内に存在しない場合、Service Broker はこのメッセージ交換に DELAYED のマークを付けます。

インスタンスの外部から受信するメッセージ交換の場合は、AutoCreatedLocal が、msdb.sys.routes での唯一のルートになります。そのルートは一致するルート セット内の唯一のルートであるため、Service Broker はそのルートを選択します。メッセージのサービスがローカル インスタンス内に存在しない場合、メッセージは削除されます。

例 4: すべての外部サービスへのネットワーク ルート

この例では、サービスがローカル インスタンスに存在しない場合に、AdventureWorks のサービスから別のインスタンスにメッセージを送信します。ローカル インスタンスに存在しないサービスのメッセージは、同じネットワーク アドレスに送信されるということに注意してください。この構成は、そのネットワーク アドレスの SQL Server インスタンスがメッセージ転送を実行する場合に役に立ちます。

この例では、AdventureWorks データベースには AutoCreatedLocal ルートだけでなく、tcp://forwarding.Adventure-Works.com:4022/ へのルートも含まれます。

AdventureWorks.sys.routes

name remote_service_name broker_instance address mirror_address

AutoCreatedLocal

NULL

NULL

LOCAL

NULL

ExternalRoute

NULL

NULL

tcp://forwarding.Adventure-Works.com:4022/

NULL

msdb.sys.routes

name remote_service_name broker_instance address mirror_address

AutoCreatedLocal

NULL

NULL

LOCAL

NULL

AdventureWorks で作成されたメッセージ交換の場合は、リモート サービス名とブローカ インスタンスが AutoCreatedLocalExternalRoute の両方のルートで同じであるため、一致するルート セットにはこれら両方のルートが含まれます。Service Broker はこれらの 2 つのルートのいずれかを選択する必要があります。Service Broker は、ネットワーク アドレスを指定するルートの前に 'LOCAL' が付いているアドレスのルートを選択するため、最初に AutoCreatedLocal を選択します。対象となるサービスがローカル インスタンス内に存在する場合、Service Broker はこのルートを使用してメッセージをそのサービスに配信します。ただし、対象となるサービスがローカル インスタンス内に存在しない場合、Service Broker は ExternalRoute を選択します。

インスタンスの外部から受信するメッセージ交換の場合は、AutoCreatedLocal が、msdb.sys.routes での唯一のルートになります。そのルートは一致するルート セット内の唯一のルートであるため、Service Broker はそのルートを選択します。メッセージのサービスがローカル インスタンス内に存在しない場合、メッセージは削除されます。

例 5: 1 つのサービスの異なるインスタンスへのネットワーク ルート

この例では、2 つの異なるネットワーク アドレスが同じサービスの異なるインスタンスをホストするルーティング構成を示します。この構成は、負荷分散構成で役立ちます。

この例では、AdventureWorks データベースには AutoCreatedLocal ルートだけでなく、BalancedService サービスへのルートも含まれています。

AdventureWorks.sys.routes

name remote_service_name broker_instance address mirror_address

AutoCreatedLocal

NULL

NULL

LOCAL

NULL

BalancedRouteOne

BalancedService

5fb8d92b-ed69-4c80-afbb-2aa6a7d3cb2d

tcp://server1.Adventure-Works.com:4022/

NULL

BalancedRouteTwo

BalancedService

81b1d3d0-288e-4d2c-b1d3-456cbb944b4f

tcp://server2.Adventure-Works.com:4022/

NULL

msdb.sys.routes

name remote_service_name broker_instance address mirror_address

AutoCreatedLocal

NULL

NULL

LOCAL

NULL

BalancedService サービスに対して AdventureWorks データベースに作成された、Service Broker 識別子を指定しないメッセージ交換の場合、一致するルート セットには BalancedRouteOne または BalancedRouteTwo のいずれかが含まれます。それぞれのルートには異なる Service Broker 識別子が含まれるため、照合処理では Service Broker 識別子を任意に選択して、そのルートを照合します。一致するルートは 1 つだけなので、Service Broker はメッセージ交換用にそのルートを選択します。結果として、一部のメッセージ交換は tcp://server1.Adventure-Works.com:4022/ にルーティングされ、他のメッセージ交換は tcp://server2.Adventure-Works.com:4022/ にルーティングされます。ただし、Service Broker はメッセージ交換のメッセージに対する受信確認を受信すると、メッセージ交換の他のメッセージに対する受信確認に含まれる Service Broker 識別子を使用します。最初の受信確認が受信されると、メッセージ交換の以降のメッセージはすべて受信確認内の Service Broker 識別子を使用してルーティングされます。

AdventureWorks データベースに作成されたメッセージ交換が、ルーティング テーブルで Service Broker 識別子のいずれかを指定する BalancedService サービスに対するものである場合、一致するルート セットに、Service Broker 識別子と一致するルートが含まれます。メッセージ交換は、その Service Broker 識別子を持つルート内のアドレスにルーティングされます。

AdventureWorks に作成されたメッセージ交換が別の対象サービスに対するものである場合、一致するルート セットに AutoCreatedLocal だけが含まれます。Service Broker はそのルートを選択します。メッセージのサービスがローカル インスタンス内に存在しない場合、Service Broker はこのメッセージ交換に DELAYED のマークを付けます。

インスタンスの外部から受信するメッセージ交換の場合は、AutoCreatedLocal が、msdb.sys.routes での唯一のルートになります。そのルートは一致するルート セット内の唯一のルートであるため、Service Broker はそのルートを選択します。メッセージのサービスがローカル インスタンス内に存在しない場合、メッセージは削除されます。

例 6: 特定のサービスに対するメッセージ転送

この例では、ElsewhereService サービスに対するローカル インスタンス外部からのメッセージを、ネットワーク アドレス tcp://elsewhere.Adventure-Works.com:4022/ に転送します。他のすべてのサービスについて、Service Broker はローカル インスタンス内の 1 つのサービスにメッセージを配信するか、サービスがローカル インスタンス内に存在しない場合は、メッセージ交換に DELAYED のマークを付けます。

AdventureWorks.sys.routes

name remote_service_name broker_instance address mirror_address

AutoCreatedLocal

NULL

NULL

LOCAL

NULL

msdb.sys.routes

name remote_service_name broker_instance address mirror_address

AutoCreatedLocal

NULL

NULL

LOCAL

NULL

ForwardingRoute

ElsewhereService

NULL

tcp://elsewhere.Adventure-Works.com:4022/

NULL

AdventureWorks で作成されたメッセージ交換の場合、AutoCreatedLocalAdventureWorks.sys.routes での唯一のルートになります。そのルートは一致するルート セット内の唯一のルートであるため、Service Broker はそのルートを選択します。メッセージのサービスがローカル インスタンス内に存在しない場合、Service Broker はこのメッセージ交換に DELAYED のマークを付けます。‏ElsewhereService サービスに対する、AdventureWorks に作成されたメッセージ交換は、tcp://elsewhere.Adventure-Works.com:4022/ にルーティングされないということに注意してください。

ElsewhereService サービスに対してインスタンスの外部から受信したメッセージ交換の場合、ルート ForwardingRoute はサービス名と完全に一致します。このため、ForwardingRoute は一致するルート セットでの唯一のルートとなり、メッセージ転送がオンの場合、Service Broker はそのルートを選択します。Service Broker は、ローカル インスタンスに ElsewhereService サービスが含まれている場合でもこのルートを選択します。メッセージ転送がオフになっている場合、Service Broker はメッセージを削除します。

他のすべてのサービスに対してインスタンスの外部から受信するメッセージ交換の場合は、AutoCreatedLocal が、msdb.sys.routes での唯一の一致するルートになります。Service Broker はそのルートを選択します。メッセージのサービスがローカル インスタンス内に存在しない場合、メッセージは削除されます。

例 7: インスタンス内に含まれないすべてのサービスに対するメッセージ転送

この例では、サービスがローカル インスタンスに含まれない場合にローカル インスタンスの外部から別のインスタンスにメッセージを送信します。すべての外部サービスのメッセージは同じネットワーク アドレスに送信されます。この構成は、メッセージ転送で役立ちます。

AdventureWorks.sys.routes

name remote_service_name broker_instance address mirror_address

AutoCreatedLocal

NULL

NULL

LOCAL

NULL

msdb.sys.routes

name remote_service_name broker_instance address mirror_address

AutoCreatedLocal

NULL

NULL

LOCAL

NULL

ForwardingRoute

NULL

NULL

tcp://forwarding.Adventure-Works.com:4022/

NULL

AdventureWorks で作成されたメッセージ交換の場合、AutoCreatedLocalAdventureWorks.sys.routes での唯一のルートになります。そのルートは一致するルート セット内の唯一のルートであるため、Service Broker はそのルートを選択します。メッセージのサービスがローカル インスタンス内に存在しない場合、Service Broker はこのメッセージ交換に DELAYED のマークを付けます。

データベースの外部から受信するメッセージ交換の場合は、AutoCreatedLocalForwardingRoute の両方のルートが同じリモート サービス名と Service Broker 識別子を指定するため、一致するルート セットにはこれら両方のルートが含まれます。Service Broker はこれらの 2 つのルートのいずれかを選択する必要があります。Service Broker は、ネットワーク アドレスを指定するルートの前に 'LOCAL' が付いているアドレスのルートを選択するため、最初に AutoCreatedLocal を選択します。対象となるサービスがローカル インスタンス内に存在する場合、Service Broker はこのルートを使用してメッセージをそのサービスに配信します。ただし、対象となるサービスがローカル インスタンス内に存在せず、メッセージ転送がオンの場合、Service Broker は ForwardingRoute を選択します。メッセージ転送がオンでない場合、対象のサービスがローカル インスタンスに存在しないと Service Broker はメッセージを削除します。

参照

概念

ルート
Service Broker のルーティング

その他の技術情報

CREATE ROUTE (Transact-SQL)
sys.routes (Transact-SQL)

ヘルプおよび情報

SQL Server 2005 の参考資料の入手