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 是一种消息传递框架,可用于创建本机数据库内面向服务的应用程序。 与在查询生命周期期间不断从表中读取数据的经典查询处理功能不同,面向服务的应用程序中提供可交换消息的数据库服务。 每个服务都有一个队列,消息在处理之前都排在队列中。

服务代理

可使用 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 托管实例的实例之间进行的跨实例服务中转消息交换以及 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 的最常见用途是事件通知。 了解如何实现事件通知配置对话框安全性获取详细信息