Service BrokerService Broker

適用対象: ○SQL Server ○Azure SQL Database (Managed Instance のみ) ×Azure SQL Data Warehouse ×Parallel Data Warehouse APPLIES TO: yesSQL Server yesAzure SQL Database (Managed Instance only) noAzure SQL Data Warehouse noParallel Data Warehouse

SQL ServerSQL Server Service BrokerService Broker では、SQL Server データベース エンジンSQL Server Database Engine および Azure SQL Database Managed Instance でのメッセージングとキューのネイティブ サポートが提供されています。Service BrokerService Broker provide native support for messaging and queuing in the SQL Server データベース エンジンSQL Server Database Engine and Azure SQL Database Managed Instance. 開発者は、データベース エンジンDatabase Engine コンポーネントを使用して異種データベース間の通信を行う高度なアプリケーションを簡単に作成し、分散型で信頼できるアプリケーションをビルドすることができます。Developers can easily create sophisticated applications that use the データベース エンジンDatabase Engine components to communicate between disparate databases, and build distributed and reliable applications.

Service Broker を使用する場合When to use Service Broker

Service Broker コンポーネントを使用して、ネイティブのデータベース内非同期メッセージ処理機能を実装します。Use Service Broker components to implement native in-database asynchronous message processing functionalities. アプリケーション開発者は、 Service BrokerService Broker を使用すれば、通信やメッセージングの複雑な内部のプログラミングを行わなくても、データ ワークロードを複数のデータベースに分散できます。Application developers who use Service BrokerService Broker can distribute data workloads across several databases without programming complex communication and messaging internals. Service BrokerService Broker によってメッセージ交換のコンテキスト内で通信パスが処理されるので、Service Broker によって開発やテストの作業が軽減されます。Service Broker reduces development and test work because Service BrokerService Broker handles the communication paths in the context of a conversation. また、パフォーマンスも向上します。It also improves performance. たとえば、Web サイトをサポートするフロントエンド データベースで情報の記録を行い、処理負荷の高いタスクはバックエンド データベースのキューに送信できます。For example, front-end databases supporting Web sites can record information and send process intensive tasks to queue in back-end databases. Service BrokerService Broker では、すべてのタスクがトランザクションのコンテキストで管理されるため、信頼性と技術的な一貫性を確保できます。ensures that all tasks are managed in the context of transactions to assure reliability and technical consistency.

概要Overview

Service Broker は、ネイティブのデータベース内サービス指向アプリケーションを作成することができるメッセージ配信フレームワークです。Service Broker is a message delivery framework that enables you to create native in-database service-oriented applications. テーブルから常にデータを読み取り、クエリのライフサイクル中に処理する従来のクエリ処理機能とは異なり、サービス指向アプリケーションには、メッセージを交換するデータベース サービスが備えられています。Unlike classic query processing functionalities that constantly read data from the tables and process them during the query lifecycle, in service-oriented application you have database services that are exchanging the messages. すべてのサービスには、メッセージが処理されるまで配置されるキューがあります。Every service has a queue where the messages are placed until they are processed.

Service Broker

Transact-SQL RECEIVE コマンドを使用するか、またはメッセージがキューに到着するたびに呼び出されるアクティブ化プロシージャによって、キュー内のメッセージをフェッチすることができます。The messages in the queues can be fetched using the Transact-SQL RECEIVE command or by the activation procedure that will be called whenever the message arrives in the queue.

サービスの作成Creating services

データベース サービスは、CREATE SERVICE Transact-SQL ステートメントを使用して作成されます。Database services are created by using the CREATE SERVICE Transact SQL statement. サービスは、CREATE QUEUE ステートメントを使用して作成されたメッセージ キューに関連付けることができます。Service can be associated with the message queue create by using the CREATE QUEUE statement:

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

メッセージの送信Sending messages

メッセージは、SEND Transact-SQL ステートメントを使用してサービス間のメッセージ交換で送信されます。Messages are sent on the conversation between the services using the SEND Transact-SQL statement. メッセージ交換は、BEGIN DIALOG Transact-SQL ステートメントを使用してサービス間で確立される通信チャネルです。A conversation is a communication channel that is established between the services using the BEGIN DIALOG Transact-SQL statement.

DECLARE @dialog_handle UNIQUEIDENTIFIER;

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

メッセージは ExpenssesService に送信され、dbo.ExpenseQueue に配置されます。The message will be sent to the ExpenssesService and placed in dbo.ExpenseQueue. このキューに関連付けられているアクティブ化プロシージャがないため、メッセージは、誰かが読み取るまでキュー内に留まります。Because there is no activation procedure associated to this queue, the message will remain in the queue until someone reads it.

メッセージの処理Processing messages

キューに配置されているメッセージは、標準の SELECT クエリを使用して選択できます。The messages that are placed in the queue can be selected by using a standard SELECT query. SELECT ステートメントでは、キューが変更されたりメッセージが削除されたりしません。The SELECT statement will not modify the queue and remove the messages. キューからメッセージを読み取ってプルするには、RECEIVE Transact-SQL ステートメントを使用します。To read and pull the messages from the queue, you can use the RECEIVE Transact-SQL statement.

RECEIVE conversation_handle, message_type_name, message_body  
FROM ExpenseQueue; 

キューからのすべてのメッセージを処理したら、END CONVERSATION Transact-SQL ステートメントを使用してメッセージ交換を終了する必要があります。Once you process all messages from the queue, you should close the conversation using the END CONVERSATION Transact-SQL statement.

Service Broker のドキュメントの格納場所Where is the documentation for Service Broker?

Service BrokerService Broker のリファレンス ドキュメントは SQL Server 2017SQL Server 2017 のドキュメントに含まれています。The reference documentation for Service BrokerService Broker is included in the SQL Server 2017SQL Server 2017 documentation. リファレンス ドキュメントには次のセクションがあります。This reference documentation includes the following sections:

の概念、開発作業、および管理作業については、 以前に公開されたドキュメント Service BrokerService Broker を参照してください。See the previously published documentation for Service BrokerService Broker concepts and for development and management tasks. SQL Server 2017SQL Server 2017Service BrokerService Broker においてわずかな変更しか加えられていないため、 SQL Server 2017SQL Server 2017用のドキュメントは作成されていません。This documentation is not reproduced in the SQL Server 2017SQL Server 2017 documentation due to the small number of changes in Service BrokerService Broker in SQL Server 2017SQL Server 2017.

Service Broker の新機能What's new in Service Broker

SQL Server 2017SQL Server 2017で導入された大きな変更はありません。No significant changes are introduced in SQL Server 2017SQL Server 2017. SQL Server 2012 (11.x)SQL Server 2012 (11.x)では、以下の変更が導入されました。The following changes were introduced in SQL Server 2012 (11.x)SQL Server 2012 (11.x).

Service Broker と Azure SQL Database Managed InstanceService broker and Azure SQL Database Managed Instance

  • インスタンス間の Service Broker はサポートされていませんCross-instance service broker is not supported
  • sys.routes - 前提条件: sys.routes からアドレスを選択してください。sys.routes - Prerequisite: select address from sys.routes. すべてのルートでアドレスをローカルにする必要があります。Address must be LOCAL on every route. sys.routes をご覧ください。See sys.routes.
  • CREATE ROUTE - CREATE ROUTELOCAL 以外の ADDRESS と共に使用することはできません。CREATE ROUTE - you cannot use CREATE ROUTE with ADDRESS other than LOCAL. CREATE ROUTE をご覧ください。See CREATE ROUTE.
  • ALTER ROUTE では、LOCAL 以外の ADDRESS と共に ALTER ROUTE を使用することはできません。ALTER ROUTE cannot use ALTER ROUTE with ADDRESS other than LOCAL. ALTER ROUTE をご覧ください。See ALTER ROUTE.

メッセージを複数の対象サービスに送信可能 (マルチキャスト)Messages can be sent to multiple target services (multicast)

SEND (Transact-SQL) ステートメントの構文が拡張され、複数のメッセージ交換ハンドルをサポートすることにより、マルチキャストが有効になりました。The syntax of the SEND (Transact-SQL) statement has been extended to enable multicast by supporting multiple conversation handles.

メッセージがエンキューされている時間の公開Queues expose the message enqueued time

メッセージがキューに格納されている時間を示す新しい列 message_enqueue_timeがキューに追加されました。Queues have a new column, message_enqueue_time, that shows how long a message has been in the queue.

有害メッセージの処理の無効化が可能Poison message handling can be disabled

CREATE QUEUE (Transact-SQL) ステートメントおよび ALTER QUEUE (Transact-SQL) ステートメントでは、POISON_MESSAGE_HANDLING (STATUS = ON | OFF) 句を追加することによって有害メッセージの処理を無効化できるようになりました。The CREATE QUEUE (Transact-SQL) and ALTER QUEUE (Transact-SQL) statements now have the ability to enable or disable poison message handling by adding the clause, POISON_MESSAGE_HANDLING (STATUS = ON | OFF). カタログ ビュー sys.service_queues に、有害メッセージの処理が有効であるか無効であるかを示す is_poison_message_handling_enabled 列が追加されました。The catalog view sys.service_queues now has the column is_poison_message_handling_enabled to indicate whether poison message is enabled or disabled.

Service Broker での Always On のサポートAlways On support in Service Broker

詳細については、「 Service Broker と Always On 可用性グループ (SQL Server)」を参照してください。For more information, see Service Broker with Always On Availability Groups (SQL Server).