ダイアログ メッセージ交換

Service Broker によって送信されるすべてのメッセージは、メッセージ交換の一部になります。ダイアログとは、2 つのサービス間のメッセージ交換のことです。ダイアログは、2 つのサービス間における信頼性の高い永続的な双方向のメッセージ ストリームです。

ダイアログは、EOIO (exactly-once-in-order) メッセージ配信を実現します。ダイアログでは、各メッセージに含まれているメッセージ交換識別子とシーケンス番号を使って関連メッセージが識別され、メッセージが正しい順序で配信されます。ダイアログは、2 つのサービス間での信頼性の高い永続的なメッセージ ストリームです。

ダイアログ メッセージ交換には、2 種類の参加者が存在します。発信側は、メッセージ交換を開始します。対象は、発信側が開始したメッセージ交換を受け付けます。メッセージ交換のコントラクトで指定されているように、どちらの参加者がメッセージ交換を開始したかによって、参加者が送信できるメッセージが決まります。次の図は、ダイアログのメッセージ フローを示しています。

発信側と受信側の間で交換されるメッセージの流れ

アプリケーションは、ダイアログの一部としてメッセージを交換します。SQL Server がダイアログのメッセージを受信すると、SQL Server では、そのメッセージがダイアログのキューに入ります。アプリケーションは、必要に応じてキューからメッセージを受信して処理します。この処理の一環として、アプリケーションはダイアログのもう一方の参加者にメッセージを送信できます。

信頼性の高い配信

ダイアログは、自動メッセージ受信確認を組み込むことで、信頼性の高い配信を実現しています。Service Broker は、送信するメッセージの受信がリモート サービスによって確認されるまで、各メッセージを転送キューに保存します。この自動受信確認によって、アプリケーションが各メッセージの受信を明示的に確認する必要がなくなるので、時間とリソースが節約されます。可能であれば、受信確認メッセージはダイアログの戻りメッセージに組み込まれます。

注意

Service Broker は、受信確認メッセージを内部で処理します。これらのメッセージはキューに入れられず、アプリケーションにも配信されません。

Service Broker は、リモート サービスがアクセス不可能になってもエラーとは見なしません。リモート サービスがアクセス不可能になると、Service Broker は、サービスがアクセス可能になるかダイアログの有効期間が終了するまで、そのサービスに対するメッセージを保持します。

ダイアログの有効期間

ダイアログの有効期間中は、アプリケーション間でメッセージを交換できます。ダイアログの有効期間は、ローカルの SQL Server インスタンスがダイアログを作成した時点からアプリケーションがダイアログを明示的に終了するまで、またはアプリケーションがダイアログに関連するエラー メッセージを受信するまで継続します。各参加者は、エラーまたはメッセージ交換の終了を示すメッセージをアプリケーションが受信したときに、メッセージ交換を明示的に終了する必要があります。ほとんどのサービスでは、一方の参加者がメッセージ交換をエラーなく終了することで、メッセージ交換の完了と成功が示されます。メッセージ交換を終了する参加者が対象であるか発信側であるかは、メッセージ交換の目的によって決まります。

発信側アプリケーションのローカル Service Broker は、アプリケーションがダイアログを開始するときにダイアログのメッセージ交換エンドポイントを作成します。対象アプリケーションのローカル Service Broker は、インスタンスがダイアログで最初のメッセージを受信するときに、ダイアログのメッセージ交換エンドポイントを作成します。

またダイアログでは、メッセージ交換の有効期間が、指定された限度を超えないようになっています。発信側アプリケーションでは、ダイアログの最長有効期間を指定することができます。ローカル Service Broker とリモート Service Broker は、どちらも有効期間を常に監視しています。最長有効期間に達した時点でダイアログがまだアクティブである場合は、メッセージ交換の各側がタイムアウト エラー メッセージをサービス キューに入れ、ダイアログの新しいメッセージを拒否します。ダイアログ開始時に設定された最長有効期間を過ぎるとメッセージ交換は行われません。メッセージ交換が終了した後もアプリケーションはメッセージ交換のメッセージを受信できますが、そのメッセージ交換に関する新しいメッセージは受信できないことに注意してください。アプリケーションは、そのメッセージ交換に関するメッセージを送信できません。

アプリケーションでは、ダイアログを明示的に終了することで、ダイアログの処理が完了したことを示す必要があります。Service Broker によって自動的にダイアログが終了することはありません。ダイアログは、アプリケーションがメッセージ交換を明示的に終了するまでデータベースに残されます。このため、ダイアログがタイムアウトになった場合、またはブローカからエラーが報告された場合でも、メッセージ交換の各参加者は END CONVERSATION ステートメントを明示的に発行する必要があります。

メッセージ交換タイマ

メッセージ交換タイマによって、アプリケーションは特定の時間にメッセージを受信できます。メッセージ交換タイマの期限が切れると、SQL Server は、メッセージ交換タイマを開始したエンドポイントで、メッセージ交換のメッセージをメッセージ交換用キューに挿入します。アプリケーションでは、メッセージ交換タイマをあらゆる目的に使用できます。メッセージ交換タイマの一般的な用途の 1 つとして、リモート サービスからの応答の遅れに応答する場合が挙げられます。また、設定された間隔でリモート サービスにメッセージを送信するサービスを作成する場合にも使用されます。たとえば、サービスでメッセージ交換タイマを使用して、SQL Server の現在の状態を数分間隔で報告することができます。アプリケーションでは、メッセージ交換タイマを使用して一定の時間にストアド プロシージャをアクティブ化することもできます。これによって、Service Broker は定期的な動作をサポートできます。

メッセージ交換の各参加者は、メッセージ交換ごとに 1 つずつメッセージ交換タイマを設定できます。メッセージ交換タイマは、他の参加者と共有されることがなく、メッセージ交換の有効期間にも影響しません。代わりに、タイマの期限が切れると、ローカル Service Broker によってローカル サービスのキューにタイムアウト メッセージが追加されます。タイムアウト メッセージの型の名前は、https://schemas.microsoft.com/SQL/ServiceBroker/DialogTimer です。