每个数据库都包含用于将 Service Broker 消息路由到该数据库的唯一标识符。 本主题介绍 Service Broker 标识符,并介绍 Service Broker 如何保护消息不被误传以及可用于管理 Service Broker 标识符的选项。
Service Broker 标识符
每个数据库都包含一个 Service Broker 标识符,用于将该数据库与网络中的其他数据库区分开来。 目录 service_broker_guid 视图的 sys.databases 列显示实例中每个数据库的 Service Broker 标识符。 Service Broker 系统可设计为运行一个服务的多个副本。 服务的每个副本在不同的数据库中运行。 在具有多个服务副本的系统中 BROKER_INSTANCE ,使用语句的 CREATE ROUTE 子句创建到服务的特定副本的路由。
Service Broker 路由使用 Service Broker 标识符来确保一个会话的所有消息都传递到同一个数据库。 该 BEGIN DIALOG CONVERSATION 语句将打开与目标服务的会话。 如果会话成功打开,来自目标服务的确认消息将包含目标数据库的 Service Broker 标识符。 然后 Service Broker 将该会话的所有消息路由到指定的数据库。
可以在语句的TO SERVICE子句中BEGIN DIALOG CONVERSATION指定 Service Broker 标识符,以控制要执行的路由类型:
若要将会话路由到指定的服务副本,请指定 service_broker_guid。 例如,可能某个服务的三个副本分别位于网络上的三个数据库中:开发数据库、测试数据库和生产数据库。 每个系统中的
BEGIN DIALOG CONVERSATION语句应指定 service_broker_guid ,以确保所有消息都转到正确的数据库。若要让 Service Broker 在服务的多个副本之间平衡会话负载,请不要指定 service_broker_guid。 Service Broker 还可以选择与子句
TO SERVICE中指定的BEGIN DIALOG CONVERSATION服务名称相同的路由。
默认情况下,如果网络中只有一个服务副本,Service Broker 会正确路由会话。 无需在或CREATE ROUTE语句中BEGIN DIALOG CONVERSATION指定 Service Broker 标识符。
有关 Service Broker 路由匹配的详细信息,请参阅 Service Broker 路由。
为了正确地支持消息传递,每个 Service Broker 标识符在同一网络上的所有数据库引擎实例中应是唯一的。 否则,消息可能会被误传。 创建新数据库时,会为其分配一个新的 Service Broker 标识符,该标识符在网络中应是唯一的。 在还原或附加数据库时将还原该标识符。 还原和附加数据库时请务必小心。 不应有多个数据库正在主动执行 Service Broker作并使用相同的标识符。
Service Broker 消息传递
SQL Server 提供一种机制,用于某一数据库与同一网络中的另一数据库具有相同的 Service Broker 标识符时,停用该数据库的 Service Broker 消息传递。 当某个数据库中停用消息传递后,所有发自该数据库的消息都将保留在该数据库的传输队列中。 此外,Service Broker 不考虑该数据库中的服务可用于接收消息。 当 Service Broker 路由在实例中找到目标服务时,不会考虑这些服务。
通过停用 Service Broker 消息传递,可以安全地附加数据库的备份,以便进行故障排除或数据恢复,而不会造成错误定向消息的风险。 显示 is_broker_enabled 每个数据库的 Service Broker 消息传递的当前状态的列 sys.databases 。
附加或还原数据库时,请务必小心以确保只有一个具有给定 Service Broker 标识符的数据库激活了消息传递。 否则,消息会被误传,而且可能在错误的数据库副本中对会话进行处理。
管理标识符和邮件传递
命令 CREATE DATABASE 、 ALTER DATABASE 命令和 RESTORE DATABASE 命令包含用于激活 Service Broker 消息传递的选项。 这些命令还包含更改数据库的 Service Broker 标识符的选项。
默认情况下,附加或还原数据库时,Service Broker 标识符和消息传递状态不发生更改。 通常,在以下情况下,不会更改 Service Broker 标识符:
- 以恢复为目的还原数据库时。
- 配置镜像对时。
- 为备用服务器设置日志传送时。 创建数据库副本时,请更改实例标识符。
有四个选项用于管理标识符和消息传递:
ENABLE_BROKER:此选项激活 Service Broker 消息传递,保留数据库的现有 Service Broker 标识符。注意
在任何数据库中启用 SQL Server Service Broker 需要数据库锁。 若要在
msdb数据库中启用 Service Broker,请先停止 SQL Server 代理。 这样 Service Broker 便可获得必要的锁。DISABLE_BROKER:此选项停用 Service Broker 消息传递,保留数据库的现有 Service Broker 标识符。NEW_BROKER:此选项激活 Service Broker 消息传递,并为数据库创建新的 Service Broker 标识符。 此选项结束数据库中的所有现有对话,并为每个会话返回错误。 这是因为这些对话不使用新标识符。 必须使用新标识符重新创建任何引用旧 Service Broker 标识符的路由。ERROR_BROKER_CONVERSATIONS:此选项激活 Service Broker 消息传递,保留数据库的现有 Service Broker 标识符。 Service Broker 结束数据库中的所有会话,并为每个会话返回错误。 通常,如果某个数据库与其他数据库之间具有打开的会话,并且您要将该数据库还原到一个不同于与之对话的数据库的时间点,则需要使用此选项。 还原的数据库中的所有对话都必须以错误结束,因为它们现在与其他数据库不同步。 Service Broker 标识符保留,以便引用该标识符的所有路由仍有效。
无论指定选项如何,SQL Server 都不允许两个具有相同 Service Broker 标识符的数据库在 SQL Server 的同一实例中处于活动状态消息传送。 如果附加一个数据库,该数据库的 Service Broker 标识符与现有数据库的标识符相同,SQL Server 将停用所附加数据库中的 Service Broker 消息传递。
有关附加数据库的选项的详细信息,请参阅 CREATE DATABASE 和 ALTER DATABASE。 有关如何在数据库中激活 Service Broker 消息传递的信息,请参阅 如何:在数据库中激活 Service Broker 消息传递。