首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server 2005 Service Broker 入門教學:非同步訊息佇列與可靠傳遞架構實作

     編輯:關於SqlServer

Service Broker 簡介

Service Broker 是 SQL Server 2005 引入的原生訊息佇列與可靠傳遞基礎設施,整合於資料庫引擎內部,提供交易性訊息佇列,支援非同步處理、服務解耦、負載平滑、跨資料庫/跨伺服器通訊。

核心物件關係圖

Message Type → Contract → Service → Queue
                    ↓
              Dialog Conversation (端對端會話)

五大核心物件詳細說明

1. Message Type(訊息類型)

定義訊息本文的驗證規則:

  • NONE:不驗證(二進位資料)。
  • EMPTY:本文必須為空。
  • WELL_FORMED_XML:本文必須為格式正確的 XML。
  • VALID_XML WITH SCHEMA COLLECTION:本文須符合指定 XML Schema Collection。

CREATE MESSAGE TYPE XMLMessage
VALIDATION = WELL_FORMED_XML;

2. Contract(契約)

定義對話雙方可使用的訊息類型與傳送方向:

  • SENT BY INITIATOR:僅啟動端可送。
  • SENT BY TARGET:僅目標端可送。
  • SENT BY ANY:雙方皆可送。

CREATE CONTRACT XMLContract
(XMLMessage SENT BY ANY);

3. Queue(佇列)

儲存訊息的內部資料表結構,支援狀態控制(ON/OFF)、保留選項:


CREATE QUEUE SendingQueue WITH STATUS = ON, RETENTION = OFF;
CREATE QUEUE ReceivingQueue WITH STATUS = ON, RETENTION = OFF;

啟動預存程序:可設定佇列在訊息到達時自動啟動預存程序(ACTIVATION),實現事件驅動處理。

4. Service(服務)

訊息傳送的邏輯端點,綁定單一佇列,宣告支援的契約:


CREATE SERVICE SendingService ON QUEUE SendingQueue (XMLContract);
CREATE SERVICE ReceivingService ON QUEUE ReceivingQueue (XMLContract);
  • 一個佇列可服務多個 Service。
  • Service 名稱在網路傳輸中作為路由鍵。

5. Dialog Conversation(對話會話)

兩個 Service 之間的雙向、有序、可靠通訊管道:

  • 由啟動端發起 BEGIN DIALOG CONVERSATION。
  • 每個對話擁有唯一 conversation_handle (UNIQUEIDENTIFIER),雙端共享。
  • 訊息在對話中保證順序交付、僅一次交付。

完整範例:同資料庫內簡單收發


-- 1. 建立物件
CREATE MESSAGE TYPE XMLMessage VALIDATION = WELL_FORMED_XML;
CREATE CONTRACT XMLContract (XMLMessage SENT BY ANY);
CREATE QUEUE SendingQueue WITH STATUS = ON, RETENTION = OFF;
CREATE QUEUE ReceivingQueue WITH STATUS = ON, RETENTION = OFF;
CREATE SERVICE SendingService ON QUEUE SendingQueue (XMLContract);
CREATE SERVICE ReceivingService ON QUEUE ReceivingQueue (XMLContract);

-- 2. 啟動對話並發送
DECLARE @handle UNIQUEIDENTIFIER;
BEGIN DIALOG CONVERSATION @handle
  FROM SERVICE SendingService
  TO SERVICE 'ReceivingService'
  ON CONTRACT XMLContract;

SEND ON CONVERSATION @handle
  MESSAGE TYPE XMLMessage
  ('Welcome to Service Broker Demo');

END CONVERSATION @handle WITH CLEANUP;

驗證收發結果


-- 查看佇列原始訊息
SELECT * FROM ReceivingQueue;

-- 解析 XML 本文
SELECT CAST(message_body AS XML) FROM ReceivingQueue;

-- 接收並移除訊息
RECEIVE CAST(message_body AS XML) FROM ReceivingQueue;

關鍵關係規則

  • 每個訊息必須符合某個 Message Type,且該 Type 必須屬於對話所用的 Contract。
  • 對話雙方的 Service 必須宣告相同的 Contract。
  • 訊息儲存在目標 Service 綁定的 Queue 中。
  • 同名 Message Type 在雙方定義必須一致(驗證規則相同)。

進階特性

適用場景

  • 非同步訂單處理、報表產生、通知發送(剝離關鍵路徑)。
  • 微服務/模組間解耦通訊(資料庫層面的 Message Bus)。
  • 跨資料庫/跨伺服器資料同步、事件通知。
  • 高可靠度需求:訊息持久化、交易性、重啟不遺失。

參考資源

  • Roger Wolter: A First Look at SQL Server 2005 Service Broker (MSDN)
  • Michael G.: Service Broker Architecture
  • Mike Taulty's Weblog: SQL Server 2005 Service Broker & WSE 2.0

Service Broker 將企業級訊息佇列能力內建於資料庫,免除外部 MQ 基礎設施部署與維運成本,是 SQL Server 內建非同步處理的最強利器。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
特性說明
啟動預存程序佇列收到訊息自動啟動處理程序,支援 MAX_QUEUE_READERS 平行度
遠端路由CREATE ROUTE 定義遠端 Service 的網路位址,支援跨實例/跨機器傳輸
傳輸安全性憑證/Windows 驗證加密通道,訊息簽章防竄改
毒訊息處理連續失敗達臨界值自動停用佇列,避免無限重試
訊息轉發轉發器支援多跳路由,構建企業級訊息總線