Service Broker
適用於:SQL Server Azure SQL 受控執行個體
SQL Server Service Broker 會在 SQL Server 資料庫引擎和 Azure SQL 受控執行個體中提供傳訊及佇列的原生支援。 開發人員能夠輕鬆建立使用資料庫引擎元件的複雜應用程式,讓不同的資料庫往來通訊,並建置可靠的分散式應用程式。
使用 Service Broker 的時機
使用 Service Broker 元件來實作資料庫內原生的非同步訊息處理功能。 使用 Service Broker 的應用程式開發人員不需要撰寫複雜的通訊和訊息間隔程式,即可將資料工作負載分散在多個資料庫。 Service Broker 可減少開發和測試工作,因為 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 文件內。 此參考文件集包含下列章節:
適用於 CREATE、ALTER 和 DROP 陳述式的資料定義語言 (DDL) 陳述式 (Transact-SQL)
請參閱過去發佈的文件,以了解 Service Broker 概念及開發和管理工作。 本文件不會在 SQL Server 文件中重製,因為 Service Broker 在最近幾版的 SQL Server 中有少許變更。
Service Broker 的新功能
Service Broker 與 Azure SQL 受控執行個體
Azure SQL 受控執行個體 之間的的跨執行個體 Service Broker 訊息交換以及SQL Server和Azure SQL 受控執行個體之間的訊息交換目前處於公開預覽狀態:
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 中的 AlwaysOn 支援
如需詳細資訊,請參閱 Service Broker 與 AlwaysOn 可用性群組 (SQL Server)。