展開が最も簡単なものの中で最も単純なものは、次の構成です。
- どこでも同じメッセージタイプとコントラクトを使用します。これはどんな状況でも必須なので、言うまでもありません。
- ダイアログセキュリティは使用しないでください。どこ
GRANT SEND ON SERVICE::[<servicename>] TO [public]
でも。これにより、データベース証明書とリモートサービスバインディングが不要になります。
- エンドポイントには証明書を使用しますが、交換しないでください(エクスポート、インポート、ログインの作成など)。トリックがあります。証明書を交換しなくても
GRANT CONNECT ON ENDPOINT::[<brokerendpointname>] TO [public]
、2つのエンドポイントがSSL(証明書)を使用して接続できるようにします。
- トランスポートルーティングを使用します(つまり、特別なルートを有効にし、規則
TRANSPORT
を使用してサービスに名前を付けます。[tcp://hostname:port/servicename]
この設定を推奨する理由を説明しましょう。
- ダイアログセキュリティを削除すると、10倍程度の展開が簡単になります。ダイアログセキュリティを使用すると、サービスは各メッセージの送信者を認証および自動化できますが、比較的制御された環境(イントラネット)では、信頼に基づいて展開できます。サービスが受信するメッセージはすべて、承認された送信者から送信されると信頼されます。
public
接続を許可するために証明書を交換する必要があるため、エンドポイントに証明書を使用することは一般に複雑と見なされますが、ブローカーエンドポイントで接続を許可するトリックにより、証明書を交換する必要がなくなります。このトリックを使用するすべてのマシンは、エンドポイントでWindows認証を使用するよりも優れた事前設定なしdomain\machine$
で相互に通信できます( roへの接続の許可が必要な場合は、特定のドメインアカウントを使用したSQL Serverインスタンスの展開が必要です)。ここでも、接続で「いいえ」と言う機能が失われ、イントラネット内の任意のSQLインスタンスからの接続を受け入れます。
- TRANSPORTルーティングを使用すると、「パーティ」に参加するSQL Serverインスタンスをすぐに使用できます。サービス名にはホスト名が含まれているため、他のすべてのマシンはこのマシンとの通信方法をすでに知っており、明示的なルートを追加する必要はありません。
この構成は、「プラグアンドプレイ」に到達するのと同じくらい実際に近いものです。新しいマシンは、他の既存のマシンの構成を変更することなく、既存のSQLServerSSBサービスとの通信にすぐに参加できます。
このような展開用にマシンを構成する方法の例を次に示します。MACHINE1
中央サーバーを次の場所にデプロイすることから始めたいとします。
use master;
go
create database master key...
create certificate [MACHINE1] with subject 'MACHINE1';
create endpoint BROKER as tcp (listener_port 4022) for service_broker
(authentication certificate [MACHINE1]);
grant connect on endpoint::BROKER to [public];
go
use db1;
create message type...
create contract ...
create queue ...
create service [tcp://MACHINE1:4022/CentralService]
on ...
([...]);
grant send on service::[tcp://MACHINE1:4022/CentralService] to [public];
create route transport with address = 'TRANSPORT';
go
それでおしまい。次に、ノードを広告します。たとえば、ホストMACHINE2で次のようにします。
use master;
go
create database master key...
create certificate [MACHINE2] with subject 'MACHINE2';
create endpoint BROKER as tcp (listener_port 4022) for service_broker
(authentication certificate [MACHINE2]);
grant connect on endpoint::BROKER to [public];
go
use db2;
create message type...
create contract ...
create queue ...
create service [tcp://MACHINE2:4022/Satellite]
on ...
([...]);
grant send on service::[tcp://MACHINE2:4022/Satellite] to [public];
create route transport with address = 'TRANSPORT';
go
それでおしまい。今、2つのことが起こります:
- MACHINE1とMACHINE2の両方のエンドポイントは証明書ベースの認証を使用し、パブリックへの接続を許可しているため、エンドポイント証明書を交換(エクスポートおよびインポート)することなく、メッセージをそのまま接続および交換できます。
- 両方のデータベースが特別なTRANSPORTルートを作成し、サービス名が特別な構文を持っているため、2つのサービスは、明示的なルーティングなしで、そのまま
[tcp://machine:port/service]
メッセージを即座に交換できます。
最良の方法は、MACHINE3などの新しいノードを追加する方法です。
use master;
go
create database master key...
create certificate [MACHINE3] with subject 'MACHINE3';
create endpoint BROKER as tcp (listener_port 4022) for service_broker
(authentication certificate [MACHINE3]);
grant connect on endpoint::BROKER to [public];
go
use db2;
create message type...
create contract ...
create queue ...
create service [tcp://MACHINE3:4022/Satellite]
on ...
([...]);
grant send on service::[tcp://MACHINE3:4022/Satellite] to [public];
create route transport with address = 'TRANSPORT';
go
これで、MACHINE1またはMACHINE2への単一の変更をホワイトアウトすると、新しいノードMACHINE3は中央サービスと、実際には必要に応じてMACHINE2の衛星ともメッセージを交換できます。エンドポイントは誰でも接続を受け入れているため、MACHINE3は歓迎され、使用されるサービス名は特別なTRANSPORTルーティングメカニズムによって自動ルーティングされます。これがこの構成の美しさであり、プラグアンドプレイです。新しいノードを追加するには、他のノードで0の構成が必要です。
では、何が得られるのでしょうか。最大の問題はセキュリティです。すべての従業員は、自分のデスクトップにSQL Server Expressをダウンロードし、許可されていないサテライトノードをセットアップして、セントラルサービスとのメッセージ交換を開始できます。彼を止めるものは何もありません。あなたはすべての門を明示的に開いています。より微妙な問題は、サービスが移動するときです。サービス[tcp://MACHINE3:4022/Satellite]
が(データベースのバックアップ/復元などを介して)MACHINE4
サービスの名前に移動された場合でも、有効なTRANSPORTルート構文名ですが、正しくありません。[tcp://MACHINE4:4022/Satellite]
既存の会話を維持することの重要性に応じて、サービスを削除し、名前とパーティという名前の新しいサービスを作成することを選択できます(サービスの名前を変更することはできません。サービスを削除して、新しいサービスを作成する必要があります)。もしもセントラルサービスデータベースに明示的なルートを追加すると、最後の手段であるTRANSPORTルートよりも優先され、メッセージが正しくリダイレクトされるため、既存の会話を維持することが重要であり、回避策があります。重要なことは解決策があるということです:)