Service Broker

適用対象:SQL ServerAzure SQL Managed Instance

SQL Server Service Broker では、SQL Server データベース エンジン および Azure SQL Database Managed Instance でのメッセージングとキューのネイティブ サポートが提供されています。 開発者は、データベース エンジン コンポーネントを使用して異種データベース間の通信を行う高度なアプリケーションを簡単に作成し、分散型で信頼できるアプリケーションをビルドすることができます。

Service Broker を使用する場合

Service Broker コンポーネントを使用して、ネイティブのデータベース内非同期メッセージ処理機能を実装します。 アプリケーション開発者は、 Service Broker を使用すれば、通信やメッセージングの複雑な内部のプログラミングを行わなくても、データ ワークロードを複数のデータベースに分散できます。 Service Broker によってメッセージ交換のコンテキスト内で通信パスが処理されるので、Service Broker によって開発やテストの作業が軽減されます。 また、パフォーマンスも向上します。 たとえば、Web サイトをサポートするフロントエンド データベースで情報の記録を行い、処理負荷の高いタスクはバックエンド データベースのキューに送信できます。 Service Broker では、すべてのタスクがトランザクションのコンテキストで管理されるため、信頼性と技術的な一貫性を確保できます。

概要

Service Broker は、ネイティブのデータベース内サービス指向アプリケーションを作成することができるメッセージ配信フレームワークです。 テーブルから常にデータを読み取り、クエリのライフサイクル中に処理する従来のクエリ処理機能とは異なり、サービス指向アプリケーションには、メッセージを交換するデータベース サービスが備えられています。 すべてのサービスには、メッセージが処理されるまで配置されるキューがあります。

Service broker

Transact-SQL RECEIVE コマンドを使用するか、またはメッセージがキューに到着するたびに呼び出されるアクティブ化プロシージャによって、キュー内のメッセージをフェッチすることができます。

サービスの作成

データベース サービスは、CREATE SERVICE Transact-SQL ステートメントを使用して作成されます。 サービスは、CREATE QUEUE ステートメントを使用して作成されたメッセージ キューに関連付けることができます。

CREATE QUEUE dbo.ExpenseQueue;
GO
CREATE SERVICE ExpensesService
    ON QUEUE dbo.ExpenseQueue; 

メッセージを送信する

メッセージは、SEND Transact-SQL ステートメントを使用してサービス間のメッセージ交換で送信されます。 メッセージ交換は、BEGIN DIALOG Transact-SQL ステートメントを使用してサービス間で確立される通信チャネルです。

DECLARE @dialog_handle UNIQUEIDENTIFIER;

BEGIN DIALOG @dialog_handle  
FROM SERVICE ExpensesClient  
TO SERVICE 'ExpensesService';  
  
SEND ON CONVERSATION @dialog_handle (@Message) ;  

メッセージは ExpenssesService に送信され、dbo.ExpenseQueue に配置されます。 このキューに関連付けられているアクティブ化プロシージャがないため、メッセージは、誰かが読み取るまでキュー内に留まります。

メッセージの処理

キューに配置されているメッセージは、標準の SELECT クエリを使用して選択できます。 SELECT ステートメントでは、キューが変更されたりメッセージが削除されたりしません。 キューからメッセージを読み取ってプルするには、RECEIVE Transact-SQL ステートメントを使用します。

RECEIVE conversation_handle, message_type_name, message_body  
FROM ExpenseQueue; 

キューからのすべてのメッセージを処理したら、END CONVERSATION Transact-SQL ステートメントを使用してメッセージ交換を終了する必要があります。

Service Broker のドキュメントの格納場所

Service Broker のリファレンス ドキュメントは SQL Server のドキュメントに含まれています。 リファレンス ドキュメントには次のセクションがあります。

の概念、開発作業、および管理作業については、 以前に公開されたドキュメント Service Broker を参照してください。 このドキュメントは、SQL Server の最新バージョンの Service Broker ではわずかにしか変更されていないため、SQL Server 用のドキュメントは作成されていません。

Service Broker の新機能

Service Broker と Azure SQL Managed Instance

Azure SQL Managed Instance のインスタンス間のクロスインスタンス サービス ブローカー メッセージ交換と、SQL Server と Azure SQL Manage Instance 間のメッセージ交換は、現在パブリック プレビュー段階です。

  • CREATE ROUTE: 指定するポートは 4022 である必要があります。 CREATE ROUTE をご覧ください。
  • ALTER ROUTE: 指定するポートは 4022 である必要があります。 ALTER ROUTE をご覧ください。

トランスポート セキュリティはサポートされていますが、ダイアログ セキュリティはサポートされていません。

  • CREATE REMOTE SERVICE BINDING がサポートされていません。

Service Broker は既定で有効になっており、無効にできません。 次の ALTER DATABASE オプションはサポートされていません。

  • ENABLE_BROKER
  • DISABLE_BROKER

SQL Server 2019 (15.x) で導入された大きな変更はありません。 SQL Server 2012 (11.x)では、以下の変更が導入されました。

メッセージを複数の対象サービスに送信可能 (マルチキャスト)

SEND (Transact-SQL) ステートメントの構文が拡張され、複数のメッセージ交換ハンドルをサポートすることにより、マルチキャストが有効になりました。

メッセージがエンキューされている時間の公開

メッセージがキューに格納されている時間を示す新しい列 message_enqueue_timeがキューに追加されました。

有害メッセージの処理の無効化が可能

CREATE QUEUE (Transact-SQL) ステートメントおよび ALTER QUEUE (Transact-SQL) ステートメントでは、POISON_MESSAGE_HANDLING (STATUS = ON | OFF) 句を追加することによって有害メッセージの処理を有効化または無効化できるようになりました。 カタログ ビュー sys.service_queues に、有害メッセージの処理が有効であるか無効であるかを示す is_poison_message_handling_enabled 列が追加されました。

Service Broker での Always On のサポート

詳細については、「 Service Broker と Always On 可用性グループ (SQL Server)」を参照してください。

次のステップ

Service Broker の最も一般的な用途は、イベント通知に使用することです。 イベント通知を実装する方法、ダイアログ セキュリティを構成する方法、詳細情報を確認してください。