每个数据库都包含用于将 Service Broker 消息路由到该数据库的唯一标识符。 本主题介绍 Service Broker 标识符,并介绍 Service Broker 如何保护消息不被误传以及可用于管理 Service Broker 标识符的选项。
Service Broker 标识符
每个数据库都包含一个 Service Broker 标识符,用于将该数据库与网络中的其他数据库区分开来。 sys.databases 目录视图的 service_broker_guid 列显示实例中每个数据库的 Service Broker 标识符。 Service Broker 系统可设计为运行一个服务的多个副本。 服务的每个副本在不同的数据库中运行。 在一个服务有多个副本的系统中,请使用 CREATE ROUTE 语句的 BROKER_INSTANCE 子句来创建到达指定服务副本的路由。
Service Broker 路由使用 Service Broker 标识符来确保一个会话的所有消息都传递到同一个数据库。 BEGIN DIALOG CONVERSATION 语句打开与目标服务间的会话。 如果会话成功打开,来自目标服务的确认消息将包含目标数据库的 Service Broker 标识符。 然后 Service Broker 将该会话的所有消息路由到指定的数据库。
Service Broker 标识符可在 BEGIN DIALOG CONVERSATION 语句的 TO SERVICE 子句中指定,以控制要执行的路由的类型:
若要将会话路由到指定的服务副本,请指定 service_broker_guid。 例如,可能某个服务的三个副本分别位于网络上的三个数据库中:开发数据库、测试数据库和生产数据库。 在每个系统中,BEGIN DIALOG CONVERSATION 语句应指定 service_broker_guid 以确保所有消息都送往正确的数据库。
若要使 Service Broker 在多个服务副本间平衡会话负载,请不要指定 service_broker_guid。 Service Broker 将在具有同一服务名称(在 BEGIN DIALOG CONVERSATION 的 TO SERVICE 子句中指定)的路由之间轮流选取。
默认情况下,如果网络中只有一个服务副本,则 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 消息传递,可以安全地附加数据库的备份以用于故障排除或数据恢复,而没有误传消息的风险。 sys.databases 的 is_broker_enabled 列显示每个数据库的 Service Broker 消息传递的当前状态。
附加或还原数据库时,请务必小心以确保只有一个具有给定 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 (Transact-SQL)。 有关如何在数据库中激活 Service Broker 消息传递的信息,请参阅如何:在数据库中激活 Service Broker 消息传递 (Transact-SQL)。