次の方法で共有


Service Broker 通信プロトコル

適用対象:SQL ServerAzure SQL Managed Instance

Service Broker はブローカー固有のプロトコルを使用してリモート ブローカーと通信します。 ブローカーは、クライアント接続の通常のプールとは別に接続を管理します。 2 つの SQL Server インスタンス間で Service Broker メッセージを交換するには、どちらのインスタンスも、相手のインスタンスが Service Broker 通信に使用しているポートに TCP/IP トラフィックを送信できる必要があります。 慣例により、Service Broker は、ブローカー間通信にポート 4022 を使用することがよくあります。 ただし、正確なポートは、エンドポイントを作成する際に指定します。

プロトコル レイヤー

Service Broker では、レイヤー化されたアプローチを通信に採用しています。 各レイヤーは、基礎となるレイヤーの上に構成され、それによって信頼性の高い配信を行うことができます。 このアプローチにより、アプリケーションは、リモート サービスの場所や、ブローカーが通信に使用する物理トランスポートに関する情報なしで動作できます。 ほとんどの場合、これらのプロトコルは、アプリケーションに対して透過的です。 ただし、各プロトコルレイヤーが果たす役割を理解することは、アプリケーションに関する問題のトラブルシューティングに役立つ場合があります。

ブローカーが使用する最上位プロトコルは、ダイアログ プロトコルです。 ダイアログ プロトコル レイヤーは、信頼性の高い、シーケンス付きメッセージ転送を処理します。 ダイアログ プロトコル レイヤーは、メッセージのシーケンス番号を生成し、受信確認メッセージを生成し、メッセージを正しいキューに配信し、メッセージをフラグメント化および再組み立てします。 ダイアログ プロトコルは、ダイアログの認証および暗号化を処理します。

ダイアログ プロトコルは、メッセージ フラグメントを転送するために、隣接するブローカー プロトコルを使用します。 隣接するブローカー プロトコルは、2 つのブローカー インスタンス間で交換されるネットワーク転送を処理します。

隣接するブローカー プロトコルは、メッセージをブローカー間で移動する際に、TCP/IP などのトランスポート プロトコルを使用します。

ダイアログ プロトコル

ダイアログ プロトコルは、メッセージ交換の、EOIO (exactly-once-in-order) メッセージ配信パターンを管理します。 このプロトコルでは、Service Broker メッセージがネットワーク上で使用する形式は記述されません。 その代わりに、このプロトコルは、信頼性の高いメッセージ交換に必要な論理的ステップを指定します。 ダイアログ プロトコルは、受信確認メッセージの生成および処理を含め、信頼性の高い配信に必要なタスクを処理します。

会話の両側は、ダイアログ プロトコル レイヤーのエンドポイントです。カタログ ビュー sys.conversation_endpoints ダイアログ プロトコル エンドポイントに関する情報が表示されます。 メッセージ交換のエンドポイントは、メッセージ交換の有効期間が終わるまで存在します。

隣接するブローカー プロトコル

隣接するブローカー プロトコル レイヤーは、2 つの SQL Server インスタンス間の通信機構を処理します。 このレイヤーは、各メッセージ フラグメントを、ネットワーク経由での転送に適した標準のフォーマットにエンコードします。 ダイアログ プロトコル レイヤーとは異なり、隣接するプロトコル レイヤーは、使用されるネットワーク トランスポートを認識し、メッセージ フラグメントを適切にフォーマットします。 実際には、隣接するブローカー プロトコル レイヤーは、ダイアログ プロトコル レイヤーとトランスポート プロトコル レイヤーの間の抽象化レイヤーを提供します。

各 Service Broker ネットワーク接続は、隣接するプロトコル レイヤーのエンドポイントです。 動的管理ビュー sys.dm_broker_connections には、Service Broker ネットワーク接続に関する情報が表示されます。 Service Broker は、メッセージが交換されている間、ネットワーク接続を維持します。 Service Broker は、短時間でもネットワーク接続経由で送受信されるメッセージがないと、ネットワーク接続を閉じます。

トランスポート プロトコル

トランスポート プロトコル レイヤーは、実際のネットワーク転送を処理します。 このレイヤーは Service Broker の外部にあります。 たとえば、SQL Server の別のインスタンスで実行されているブローカーへのメッセージには、トランスポート プロトコル レイヤーとして TCP/IP が使用されます。

Service Broker エンドポイントでは、トランスポート プロトコルのオプションが設定されます。 既定では、SQL Server には Service Broker エンドポイントは含まれません。 Service Broker エンドポイントの作成の詳細については、「 方法: Service Broker ネットワークをアクティブ化する」を参照してください。

Service Broker メッセージ処理

Service Broker では、異なる 2 種類のメッセージが使用されます。 シーケンス付きメッセージは、アプリケーションに正しい順序で一度だけ配信される必要のあるメッセージです。 シーケンスが付けられていないメッセージは、メッセージが着信した順序に関係なく、直ちに処理することのできるメッセージです。

Service Broker は、すべてのユーザー定義メッセージ型、終了ダイアログ メッセージ、およびアプリケーションが生成したエラー メッセージに対して、シーケンス付きメッセージを使用します。 各シーケンス付きメッセージは、シーケンス番号を持っています。 メッセージを送信するインスタンスは、メッセージ シーケンス番号を生成し、そのシーケンス番号をメッセージに割り当てます。 受信側のブローカーは、そのメッセージ シーケンス番号を使用して、アプリケーションに渡すメッセージを配列します。 1 つのダイアログ内では、アプリケーションは常にシーケンス番号が最も小さいメッセージを最初に受け取ります。 Service Broker は、重複したメッセージを検出する際にも、メッセージ シーケンス番号を使用します。 ダイアログ プロトコル レイヤーが、同じシーケンス番号の、同じダイアログに関する 2 つのメッセージを受信した場合、ダイアログ プロトコル レイヤーはメッセージが重複しているものと見なし、一方を破棄します。

Service Broker は、専用の受信確認メッセージ、および Service Broker が生成したエラー メッセージに対して、シーケンスが付けられていないメッセージを使用します。 Service Broker は、シーケンスが付けられていないメッセージを配信する際に、特別な対策は行いません。 ただし、Service Broker は、受信メッセージに応答して、順序が付けられていないメッセージを作成します。 そのため、シーケンスが付けられていないメッセージが失われると、送信側は元のメッセージの送信を再試行します。その場合、受信側はシーケンスが付けられていないメッセージを再び生成します。

メッセージの断片化

Service Broker では、送信するメッセージをフラグメントに分割し、着信したフラグメントを結合して元のメッセージにします。 サイズの小さなメッセージの場合は、そのメッセージ全体が 1 つのフラグメントに含まれます。 サイズの大きなメッセージの場合は、Service Broker によって多数のフラグメントが作成されます。

メッセージをフラグメント化することには、いくつかの利点があります。 サイズの大きなメッセージを小さなフラグメントに分割して送信すると、ワイドエリア ネットワーク (WAN) などの比較的低速で信頼性の低いネットワーク経由で通信する場合に、全体的な速度と信頼性が向上します。 メッセージを構成するフラグメントの 1 つが失われた場合には、メッセージ全体ではなく、1 つのフラグメントのみが再転送されます。 サイズの大きなメッセージをフラグメント化することで、サイズの小さなメッセージが転送先に到達するための所要時間を短縮することもできます。 Service Broker は、サイズの小さなメッセージ全体を格納した 1 つのフラグメントを、サイズの大きなメッセージの複数のフラグメント間に送信できます。 この場合、サイズの小さなメッセージが転送を待機する時間を短縮するため、サイズの大きなメッセージの転送速度がわずかに遅くなります。

メッセージが再構築されている間、メッセージの断片は、転送先のキューに格納されます。 宛先キューを使用できない場合は、転送キューに格納されます。 部分的なメッセージは、アプリケーションで受信できません。 部分的なメッセージの status 列は、 2 (無効) に設定されています。 この値は、間違った順番で受信されたメッセージにも使用されます。

メッセージ受信確認

Service Broker は、受信した各メッセージに対して受信確認を行います。 受信確認は、1 つまたは複数のメッセージ フラグメントを確認することができます。 可能な場合、受信確認は、同じメッセージ交換で返送されるメッセージのヘッダーに組み込まれます。 送信できるメッセージが他にない場合、Service Broker は専用の受信確認メッセージを返送します。 メッセージ受信確認は Service Broker によって完全に処理されます。Service Broker を使用するアプリケーションは、これらのメッセージを受信しません。

送信者は、受信側が受信確認していないメッセージ フラグメントを保持します。 システム定義の待機時間内に受信確認が受信されない場合には、送信側はそのメッセージ フラグメントを再送信します。 待機時間内に受信確認が受信されない場合、Service Broker では、次の再試行までの待機時間を、最大待機時間に達するまで幾何級数的に増加させながら、再試行を繰り返します。 再試行までの最初の待機時間は数秒間です。 最大待機時間は、およそ 1 分間です。 待機時間は正確なものではありません。ネットワーク トラフィックと SQL Server インスタンス内の他のアクティビティによっては、待機時間の有効期限が切れた後、メッセージ フラグメントが数秒間再試行されない場合があります。

受信確認が失われたり遅延したりすると、受信者は重複するメッセージを受信する可能性があります。 この場合、受信者は重複メッセージの受信を確認しますが、重複するメッセージはキューに配信しません。

Service Broker では、メッセージ受信確認を、分散トランザクションを使用せずに信頼性の高いメッセージを提供するために使用します。 受信側は、メッセージまたはメッセージ フラグメントをキューに追加した後でのみ、受信確認を送信します。 送信側は、メッセージの受信確認が到着するまで、そのメッセージを転送キュー内に保持します。 送信者と受信者はトランザクションを共有しませんが、プロトコルは、受信者がメッセージを正常に受信するまで、送信者が送信キューからメッセージを削除しないことを保証します。

メッセージ整合性チェック

Service Broker がメッセージの転送に使用するフォーマットには、メッセージが転送中に変更されたり、破損したりしていないかどうかを判別するために、メッセージの整合性チェックが含まれています。

メッセージの整合性チェックには、メッセージの内容に関する MD5 署名が使用されます。 SQL Server は、メッセージのセッション キーを使用して署名を暗号化し、その署名をメッセージ ヘッダーに組み入れます。

メッセージの転送先は、メッセージの暗号化を解除し、メッセージ内の署名を、受信した実際の内容から計算した新しい署名と比較します。 署名が一致しない場合は、送信中にメッセージが破損または改ざんされています。 メッセージはメッセージの整合性チェックに失敗します。 SQL Server はメッセージを破棄し、送信者へのメッセージを確認しません。 メッセージがメッセージの整合性チェックに失敗すると、Broker:Corrupted Message イベント クラスが情報を報告します。

Service Broker 転送オブジェクト

Service Broker 転送オブジェクトとは、ダイアログのメッセージ転送状態を管理および記録する、メモリ内オブジェクトです。 メッセージ交換エンドポイントごとに 1 つの転送オブジェクトがあります。

ダイアログが転送オブジェクトを要求するのは、次のような場合です。

  • 転送キュー経由でメッセージを送信する場合。 これには、次の内容が含まれます。

    • データベース エンジンのリモート インスタンスに送信されたすべてのメッセージ

    • メッセージを宛先キューに直接挿入できない場合に、ローカル インスタンスで送信されたキューへのメッセージ

  • リモート メッセージ、またはローカルの転送キューからのメッセージを受信する場合。

転送オブジェクトは、最初にダイアログによって要求されたときに作成されます。 Service Broker では、そのダイアログからの以降の要求に同じ転送オブジェクトを使用します。 転送オブジェクトは、Service Broker がダイアログの転送状態の変化を記録する必要が生じるたびに変更されます。 転送オブジェクトは約 1 KB です。

メモリを解放するために、Service Broker は非アクティブな転送オブジェクトのバッチを tempdb 作業テーブルに定期的に格納します。 転送オブジェクトがメモリ内で最初に変更されると、ダーティとしてマークされます。 転送オブジェクトは、作業テーブルにフラッシュされるまでダーティとしてマークされたままです。

転送オブジェクトは、送信先キューに直接挿入できるローカル メッセージの送受信には使用されません。

ネットワーク通信フロー

次の図に、2 つの SQL Server インスタンス間で行われる Service Broker ネットワーク通信の概要を示します。

2 つのインスタンス間のブローカー ネットワーク通信の図。

会話は永続的な論理接続です。 メッセージ交換は、任意の期間にわたって行われ、その期間内に、任意の数のネットワーク接続を使用します。

ネットワーク接続は、2 つの Service Broker エンドポイント間で行われます。 これらの接続では、TCP/IP が使用されます。 接続が短期間でも非アクティブになると、SQL Server はネットワーク接続を閉じます。

メッセージを配信するために、Service Broker は、メッセージを送信したデータベースの転送キューにそのメッセージを保持します。 受信側は、転送先サービスのキューに、メッセージを直接配信します。 そのキューが OFFされている場合、メッセージは受信側データベースの伝送キューに一時的に保持されます。 送信サービスのキューが操作に関与していません。 受信側サービスをホストするデータベースの伝送キューは、宛先キューが OFF場合にのみ関係します。