SQL Server Service Broker(简称SSB)是SQL Server数据库引擎内置的异步消息队列组件,不需要额外安装第三方中间件就能实现数据库内部的可靠消息传递,适合处理需要解耦、异步执行的业务场景,比如订单创建后异步通知库存系统、批量任务的分发执行等。

SSB核心概念说明
在搭建实例前需要先了解SSB的几个核心对象,这些对象共同构成了SSB的消息处理链路:
- 消息类型(Message Type):定义消息的格式规范,用来校验发送和接收的消息是否符合约定
- 约定(Contract):指定哪些消息类型可以被哪些角色发送和接收,明确消息交互的规则
- 队列(Queue):存储接收到的消息的容器,消息会暂时存放在队列中等待处理
- 服务(Service):将队列和约定绑定,是消息发送和接收的端点
SSB入门实例完整步骤
1. 开启数据库SSB功能
首先需要在目标数据库中启用Service Broker功能,执行以下SQL语句:
-- 启用数据库的Service Broker,替换YourDatabase为实际数据库名 ALTER DATABASE YourDatabase SET ENABLE_BROKER; -- 可选:设置信任数据库,方便后续跨库消息传递 ALTER DATABASE YourDatabase SET TRUSTWORTHY ON;
2. 定义消息类型和约定
先创建消息类型,再基于消息类型创建约定,这里定义一个简单的文本消息类型:
-- 创建消息类型,指定消息校验方式为无校验,适合简单文本消息
CREATE MESSAGE TYPE SampleMessageType
VALIDATION = NONE;
-- 创建约定,指定发起方可以发送SampleMessageType类型的消息,接收方可以接收该类型消息
CREATE CONTRACT SampleContract
(
SampleMessageType SENT BY INITIATOR
);
3. 创建队列和服务
分别创建发送端和接收端的队列与服务,发送端服务用于发送消息,接收端服务用于接收消息:
-- 创建发送端队列
CREATE QUEUE SendQueue;
-- 创建发送端服务,绑定发送队列和约定
CREATE SERVICE SendService
ON QUEUE SendQueue
(
SampleContract
);
-- 创建接收端队列
CREATE QUEUE ReceiveQueue;
-- 创建接收端服务,绑定接收队列和约定
CREATE SERVICE ReceiveService
ON QUEUE ReceiveQueue
(
SampleContract
);
4. 发送测试消息
使用SEND语句向接收端服务发送消息,代码如下:
-- 定义会话句柄变量
DECLARE @dialog_handle UNIQUEIDENTIFIER;
-- 开始一个对话,指定发起方服务、目标服务和使用的约定
BEGIN DIALOG CONVERSATION @dialog_handle
FROM SERVICE SendService
TO SERVICE 'ReceiveService'
ON CONTRACT SampleContract
WITH ENCRYPTION = OFF;
-- 发送消息,消息内容为文本格式的测试内容
SEND ON CONVERSATION @dialog_handle
MESSAGE TYPE SampleMessageType
('这是第一条SSB测试消息');
-- 结束对话
END CONVERSATION @dialog_handle;
5. 接收并处理消息
从接收端队列中读取消息,处理完成后结束对话,代码如下:
-- 定义接收消息的变量
DECLARE @message_body NVARCHAR(MAX);
DECLARE @dialog_handle UNIQUEIDENTIFIER;
DECLARE @message_type NVARCHAR(256);
-- 从接收队列中接收消息,TOP(1)表示只取一条消息
RECEIVE TOP(1)
@message_body = message_body,
@dialog_handle = conversation_handle,
@message_type = message_type_name
FROM ReceiveQueue;
-- 输出接收到的消息内容
SELECT @message_body AS 接收到的消息内容;
-- 如果对话还在,结束对话
IF @dialog_handle IS NOT NULL
BEGIN
END CONVERSATION @dialog_handle;
END
实例验证与注意事项
执行完发送消息的SQL后,再执行接收消息的SQL,应该能看到输出的消息内容为“这是第一条SSB测试消息”,说明整个SSB实例运行正常。
需要注意的几个点:
- 对话必须显式结束,否则会留下未结束的会话占用系统资源
- 如果消息类型设置了校验规则,发送的消息必须符合规则否则会报错
- 队列中的消息如果没有被接收,会一直存储在队列中,需要定期处理避免队列堆积
简单应用场景说明
这个入门实例可以扩展到实际业务中,比如用户下单后,业务层只需要向SSB发送一个订单消息,后台的库存处理服务、积分服务可以分别从队列中接收消息处理自己的逻辑,不需要业务层逐个调用不同服务的接口,实现了业务解耦。如果需要更复杂的场景,还可以结合SQL Server的存储过程、作业来定时处理队列中的消息,实现可靠的异步任务执行。
SQL_Server_Service_BrokerSSB数据库消息队列Service_Broker入门修改时间:2026-07-02 14:48:24