分享方式:


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 是一種訊息傳遞架構,可讓您建立資料庫內原生的服務導向應用程式。 不同於傳統查詢處理功能 (其會在查詢生命週期過程中,從資料表持續讀取資料並加以處理),在服務導向的應用程式中,您的資料庫服務會交換訊息。 每個服務都有一個佇列,訊息在處理之前均放置於其中。

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 受控執行個體

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)

後續步驟

Service Broker 最常見的用法是事件通知。 了解如何實作事件通知設定安全性對話方塊,或取得更多資訊