次の方法で共有


サービスブローカー

適用対象: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 コマンドを使用するか、メッセージがキューに到着するたびに呼び出されるアクティブ化プロシージャを使用してフェッチできます。

サービスの作成

ターゲット サービスは、1 つ以上の コントラクトを公開する必要があります。 コントラクトなしでサービスを作成すると、メッセージを受信できなくなります。 送信されたメッセージは成功したように見えますが、メッセージはイニシエーターのsys.transmission_queueに残ります

/*
In this example, the initiator must then use ON CONTRACT [DEFAULT] and a MESSAGE TYPE [DEFAULT]. [DEFAULT] is a delimited identifier for the built‑in contract and isn't a T‑SQL keyword, so it must be bracketed or quoted.
*/
CREATE QUEUE dbo.ExpenseQueue;
GO

CREATE SERVICE ExpensesService
ON QUEUE dbo.ExpenseQueue ([DEFAULT]);

メッセージを送信する

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

-- Begin a dialog
DECLARE @dialog_handle AS UNIQUEIDENTIFIER;

BEGIN DIALOG @dialog_handle
    FROM SERVICE ExpensesClient
    TO SERVICE N'ExpensesService'
    ON CONTRACT [DEFAULT];

-- Send a message
SEND ON CONVERSATION (@dialog_handle)
    MESSAGE TYPE [DEFAULT] (N'<Expense ExpenseId="1" Amount="123.45" Currency="USD"/>');

メッセージは ExpensesService に送信され、 dbo.ExpenseQueueに配置されます。 このキューにはアクティブ化手順が関連付けられていないため、メッセージは他のユーザーが読み取るまでキューに残ります。

メッセージの処理

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

RECEIVE TOP (1)
    conversation_handle,
    message_type_name,
    TRY_CAST (message_body AS NVARCHAR (MAX)) AS message_body_text
FROM dbo.ExpenseQueue;
GO

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

-- Drain any remaining target conversations for the from the queue
DECLARE @conversation_hdl AS UNIQUEIDENTIFIER;

WHILE EXISTS (SELECT 1 FROM dbo.ExpenseQueue)
    BEGIN
        RECEIVE TOP (1) @conversation_hdl = conversation_handle FROM dbo.ExpenseQueue;
        END CONVERSATION @conversation_hdl;
    END
GO

Service Broker のドキュメント

Service Broker の詳細については、以下を参照してください。

また、Service Broker の概念と開発および管理タスクについては、 以前に公開されたドキュメント を参照することもできます。

Service Broker の新機能

Service Broker と Azure SQL Managed Instance

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

  • CREATE ROUTE: 指定するポートは 4022 である必要があります。 CREATE ROUTE (Transact-SQL) を参照してください。
  • ALTER ROUTE: 指定するポートは 4022 である必要があります。 ALTER ROUTE (Transact-SQL) を参照してください。

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

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

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

  • ENABLE_BROKER
  • DISABLE_BROKER

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

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

SEND ステートメントの構文は、複数の会話ハンドルをサポートすることでマルチキャストを有効にするように拡張されました。

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

キューには、メッセージがキューに入っている時間を示す新しい列 ( message_enqueue_time) があります。

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

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

Service Broker での可用性グループのサポート

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