次の方法で共有


Service Broker ルーティングの例

適用対象:SQL ServerAzure SQL Managed Instance

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

この記事のコード サンプルは、AdventureWorks2025 サンプル データベースを使用してテストされました。このサンプル データベースは、Microsoft SQL Server サンプルとコミュニティ プロジェクト ホーム ページからダウンロードできます。

このトピックで説明するルーティング テーブルは、 sys.routes カタログ ビューの簡略化されたバージョンです。 ルート ID と所有者はルーティング プロセスにとって重要ではなく、すべてのルートは無期限の有効期間を持つと見なされます。

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

送信メッセージの例では、 msdbのルーティング テーブルは使用されません。また、受信メッセージとメッセージ転送の例では、 AdventureWorks2008R2のルーティング テーブルは使用されません。

例 1: 既定の構成

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

コラム AdventureWorks2008R2 msdb
name AutoCreatedLocal AutoCreatedLocal
remote_service_name NULL NULL
broker_instance NULL NULL
address LOCAL LOCAL
mirror_address NULL NULL

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

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

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

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

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

コラム AdventureWorks2008R2 AdventureWorks2008R2 msdb
name AutoCreatedLocal OrderPartsRoute AutoCreatedLocal
remote_service_name NULL OrderParts NULL
broker_instance NULL NULL NULL
address LOCAL TCP://host2.Adventure-Works.com:4022/ LOCAL
mirror_address NULL NULL NULL

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

ターゲット サービスが AdventureWorks2008R2OrderPartsで作成された会話の場合、一致するルートのセットにはOrderPartsRouteが含まれます。これは、このルートがサービス名と完全に一致するためです。 OrderPartsRoute は一致するルートのセット内の唯一のルートであるため、Service Broker はそのルートを選択します。

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

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

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

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

コラム AdventureWorks2008R2 AdventureWorks2008R2 msdb
name AutoCreatedLocal OrderPartsRoute AutoCreatedLocal
remote_service_name NULL OrderParts NULL
broker_instance NULL NULL NULL
address LOCAL TCP://partner1.Adventure-Works.com:4022/ LOCAL
mirror_address NULL TCP://partner2.Adventure-Works.com:4022/ NULL

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

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

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

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

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

この例では、 AdventureWorks2008R2 データベースには、 AutoCreatedLocal ルートとアドレス TCP://forwarding.Adventure-Works.com:4022/へのルートが含まれています。

コラム AdventureWorks2008R2 AdventureWorks2008R2 msdb
name AutoCreatedLocal ExternalRoute AutoCreatedLocal
remote_service_name NULL NULL NULL
broker_instance NULL NULL NULL
address LOCAL TCP://forwarding.Adventure-Works.com:4022/ LOCAL
mirror_address NULL NULL NULL

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

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

例 5: サービスのさまざまなインスタンスへのネットワーク ルート

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

この例では、 AdventureWorks2008R2 データベースには、 AutoCreatedLocal ルートとサービス BalancedServiceへのルートが含まれています。

コラム AdventureWorks2008R2 AdventureWorks2008R2 AdventureWorks2008R2 msdb
name AutoCreatedLocal BalancedRouteOne BalancedRouteTwo AutoCreatedLocal
remote_service_name NULL BalancedService BalancedService NULL
broker_instance NULL 5fb8d92b-ed69-4c80-afbb-2aa6a7d3cb2d 81b1d3d0-288e-4d2c-b1d3-456cbb944b4f NULL
address LOCAL TCP://server1.Adventure-Works.com:4022/ TCP://server2.Adventure-Works.com:4022/ LOCAL
mirror_address NULL NULL NULL NULL

service Broker 識別子を指定しないサービス AdventureWorks2008R2へのBalancedService データベースで作成された会話の場合、一致するルートのセットには、BalancedRouteOneBalancedRouteTwoが含まれます。 ルートには異なる 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 識別子を使用してルーティングされます。

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

別のターゲット サービスへの AdventureWorks2008R2 で作成された会話の場合、一致するルートのセットには AutoCreatedLocalのみが含まれます。 Service Broker はそのルートを選択します。 メッセージのサービスがローカル インスタンスに存在しない場合、Service Broker は会話 DELAYEDをマークします。

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

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

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

コラム AdventureWorks2008R2 msdb msdb
name AutoCreatedLocal AutoCreatedLocal ForwardingRoute
remote_service_name NULL NULL ElsewhereService
broker_instance NULL NULL NULL
address LOCAL LOCAL TCP://elsewhere.Adventure-Works.com:4022/
mirror_address NULL NULL NULL

AdventureWorks2008R2で作成された会話の場合、AutoCreatedLocalの唯一のルートはAdventureWorks2008R2.sys.routesです。 そのルートは一致するルート セット内の唯一のルートであるため、Service Broker はそのルートを選択します。 メッセージのサービスがローカル インスタンスに存在しない場合、Service Broker は会話 DELAYEDをマークします。 サービス AdventureWorks2008R2へのElsewhereServiceで作成された会話は、TCP://elsewhere.Adventure-Works.com:4022/にルーティングされません。

インスタンスの外部からサービス ElsewhereServiceに到着する会話の場合、ルート ForwardingRoute はサービス名と正確に一致します。 そのため、 ForwardingRoute は一致するルートのセット内で唯一のルートであり、Service Broker はメッセージ転送がオンのときにそのルートを選択します。 ローカル インスタンスにサービス ElsewhereServiceが含まれている場合でも、Service Broker はこのルートを選択します。 メッセージ転送がオフになっている場合、Service Broker はメッセージを削除します。

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

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

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

コラム AdventureWorks2008R2 msdb msdb
name AutoCreatedLocal AutoCreatedLocal ForwardingRoute
remote_service_name NULL NULL NULL
broker_instance NULL NULL NULL
address LOCAL LOCAL TCP://forwarding.Adventure-Works.com:4022/
mirror_address NULL NULL NULL

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

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