Service Broker 為 SQL Server 2005 引入原生非同步訊息平台,提供可靠佇列、會話群組、分散式對話協定、交易性訊息、動態啟動五大支柱,徹底解決自建佇列的並發、可靠、擴展難題。
以「機場單一佇列、多櫃台」為喻:
BEGIN TRANSACTION;
RECEIVE ... FROM queue; -- 1. 接收訊息(含群組鎖定)
SELECT state FROM state_tbl; -- 2. 讀取狀態
-- 3. 業務邏輯與資料更新
SEND ON CONVERSATION ...; -- 4. 發送回應/後續訊息
UPDATE state_tbl SET ...; -- 5. 更新狀態
COMMIT TRANSACTION; -- 6. 原子提交:全成或全捲回
崩潰時自動回滾:訊息回佇列、資料還原、無殘留訊息,錯誤處理極簡化。
MAX_QUEUE_READERS)。| 物件 | 用途 |
|---|---|
| QUEUE | 訊息容器,提供鬆散耦合;SEND 寫入,RECEIVE 讀取。 |
| CONVERSATION | 雙向、有序、持久會話通道;所有訊息攜帶會話控制代碼。 |
| MESSAGE TYPE | 訊息標籤,可綁定 XML Schema Collection 驗證承載。 |
| CONTRACT | 訊息類型集合,定義對話雙方可發送的訊息類型與發送方角色。 |
| SERVICE | 將一或多個 CONTRACT 繫結至 QUEUE;服務名稱作為對話端點別名,支援部署時解耦。 |
CREATE DATABASE HelloWorldDB; GO
USE HelloWorldDB; GO
CREATE MESSAGE TYPE [HelloWorldRequest] VALIDATION = NONE;
CREATE MESSAGE TYPE [HelloWorldResponse] VALIDATION = NONE;
CREATE CONTRACT [HelloWorldContract]
(
[HelloWorldRequest] SENT BY INITIATOR,
[HelloWorldResponse] SENT BY TARGET
);
CREATE QUEUE [HelloWorldTargetQueue];
CREATE QUEUE [HelloWorldInitiatorQueue];
CREATE SERVICE [HelloWorldRequestService]
ON QUEUE [HelloWorldTargetQueue] ([HelloWorldContract]);
CREATE SERVICE [HelloWorldResponseService]
ON QUEUE [HelloWorldInitiatorQueue] ([HelloWorldContract]);
DECLARE @ch UNIQUEIDENTIFIER;
BEGIN TRANSACTION;
BEGIN DIALOG @ch
FROM SERVICE [HelloWorldResponseService]
TO SERVICE 'HelloWorldRequestService'
ON CONTRACT [HelloWorldContract]
WITH ENCRYPTION = OFF, LIFETIME = 600;
SEND ON CONVERSATION @ch MESSAGE TYPE [HelloWorldRequest] (N'Hello World');
COMMIT;
DECLARE @ch UNIQUEIDENTIFIER, @msg_body NVARCHAR(MAX), @msg_type SYSNAME;
BEGIN TRANSACTION;
RECEIVE TOP(1)
@msg_type = message_type_name,
@ch = conversation_handle,
@msg_body = CAST(message_body AS NVARCHAR(MAX))
FROM [HelloWorldTargetQueue];
IF @msg_type = N'HelloWorldRequest'
BEGIN
SEND ON CONVERSATION @ch MESSAGE TYPE [HelloWorldResponse] (N'Hello From ' + @@SERVERNAME);
END CONVERSATION @ch;
END
COMMIT;
SELECT CAST(message_body AS NVARCHAR(MAX)) FROM [HelloWorldInitiatorQueue];
RECEIVE CAST(message_body AS NVARCHAR(MAX)) FROM [HelloWorldInitiatorQueue];


SEND 訊息至佇列,主交易秒級提交,避免觸發器拖慢 DML。

SQL Server 2005 Service Broker 以資料庫原生方式實現可靠、有序、交易性、可擴展的分散式非同步訊息平台。配合 CLR、XML、ADO.NET 2.0,構成新一代高擴展資料庫應用開發的堅實基石。掌握其核心物件模型與交易性處理模式,即可輕鬆構建從簡單內部佇列到跨企業分散式工作流的各類應用。