共用方式為


服務代理

適用於:SQL ServerAzure 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 指令來提取佇列中的訊息,或透過每當訊息到達佇列時呼叫的啟動程序來提取。

建立服務

備註

目標服務必須公開一或多個 合約。 如果您建立沒有合約的服務,它將無法接收訊息。 傳送的訊息似乎成功,但訊息仍保留在啟動器的 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 受控執行個體

目前 Azure SQL 受控執行個體之間的跨執行個體 Service Broker 訊息交換,以及 SQL Server 與 Azure 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 QUEUEALTER QUEUE 陳述式現在能夠透過新增 POISON_MESSAGE_HANDLING (STATUS = ON | OFF) 子句來啟用或停用毒性訊息處理。 型錄視圖 sys.service_queues 現在具有欄位 is_poison_message_handling_enabled,表示毒性訊息是啟用還是停用。

Service Broker 中的可用性群組支援

如需詳細資訊,請參閱 Service Broker 與 AlwaysOn 可用性群組 (SQL Server)