Service Broker 路由

适用于:SQL ServerAzure SQL 托管实例

本文介绍 Service Broker 如何路由消息的详细信息。 有关概述,请参阅路由

对于大多数应用程序,可以使用一个简单的 Service Broker 路由方法。 在包含服务的每个数据库中,为该服务与之通信的外部服务指定一个路由。 同时,Service Broker 还提供一个复杂的路由系统,以处理应用程序需要更复杂行为时的情况。 有关演示路由过程的示例,请参阅 Service Broker 路由示例

路由进程说明

SQL Server 维护两种不同级别的路由信息。 每个数据库都包含一个本地路由表, sys.routes用于在该数据库中启动的对话。 对于在 SQL Server 实例中发起的对话,SQL Server 会在创建此对话的数据库中搜索该路由表。 对于从实例外部到达的对话,SQL Server 搜索 msdb.sys.routes

无论会话是从实例内部还是从实例外部发起的,基本的匹配过程都是相同的。 此过程忽略已过期的路由。 路由处理过程由三个不同的步骤组成:

  1. 查找匹配路由:Service Broker 通过匹配服务名称和 Service Broker 标识符来查找一组可能的路由。

  2. 选择路由:Service Broker 从一组可能的路由中选择一个路由。

  3. 找到目标服务:选择的路由指定 'LOCAL' 为网络地址时,Service Broker 将查找实例中的服务。 如果实例中不存在服务,Service Broker 可能会返回到步骤 2 并选择另一个路由。

在消息从发起方发送到目标并且发起方收到来自目标的确认消息之后,发起方将使用确认消息中的 Service Broker 标识符将后继消息路由到同一目标。 Service Broker 对确认消息进行处理;该过程对于使用 Service Broker 的应用程序是透明的。 有关确认消息的详细信息,请参阅 Service Broker 通信协议

来自目标服务的回复消息

如果从实例外部到达的消息来自目标服务,则 SQL Server 将检查当前实例是否包含消息中的 SQL Server 标识符。 如果是这样,则会在当前实例中传递消息,如本文后面的 “查找目标服务 ”中所述。 否则,SQL Server 遵循标准匹配过程。

查找匹配路由

下面的过程说明 SQL Server 如何匹配路由。 在每一步,如果有一个或多个路由匹配,则结束匹配过程,然后 Service Broker 将按如下所述选择匹配的路由之一:

  1. 如果对话指定了 Service Broker 标识符,则查找服务名称和 Service Broker 标识符都完全匹配的路由。

  2. 在未指定 Service Broker 标识符的路由中查找服务名称的完全匹配项。

  3. 如果会话未指定 Service Broker 标识符,请在那些指定了 Service Broker 标识符的路由中找到服务名称的完全匹配项。 如果路由表包含多个具有匹配的服务名称但 Service Broker 标识符不同的路由,则将任意选择一个 Service Broker 标识符。 然后,仅匹配使用该 Service Broker 标识符的路由。

  4. 如果存在到动态路由服务的路由,而且没有挂起的对服务路由的请求,则将会话标记为 DELAYED 并向动态路由服务请求路由信息。

  5. 查找既没有指定服务名称也没有指定 Service Broker 标识符的路由。

  6. 如果会话指定 Service Broker 标识符,并且实例包含一个或多个数据库,其中包含与会话中指定的名称匹配的服务,则路由会话,就像路由表包含具有服务名称和网络地址 'LOCAL'的路由一样。

  7. 将会话标记为 DELAYED。

当会话标记为延迟时,Service Broker 在超时期限后再次执行匹配过程。 找不到匹配路由并不被视为错误。

选择路由

如果匹配过程找到多个匹配的路由,则 Service Broker 将从中选择一个路由。 为此,具有相同 Service Broker 标识符、服务名称和网络地址的路由被视为相同的路由。 Service Broker 使用下面的过程选择确切的路由。 在每个步骤中,如果没有路由匹配此步骤中列出的地址规范,则继续执行下一步。

  1. 从指定镜像地址的路由中选择一个。

  2. 从指定 'LOCAL' 为网络地址的路由中选择一个路由。 如果此 SQL Server 实例不包含与会话中指定的名称匹配的服务,请继续执行步骤 3。

  3. 从指定网络地址的路由中选择一个。

  4. 从指定 'TRANSPORT' 为网络地址的路由中选择一个路由。

如果中转站转发未处于活动状态,则 Service Broker 会删除该消息(如果会话不源自当前实例,并且所选路由的地址不是 'LOCAL')。

找到目标服务

如前所述,当匹配路由指定 'LOCAL' 为网络地址时,Service Broker 会将消息传送到当前实例中的服务。 对于源自实例外部的消息,路由必须位于 msdb.sys.routes。 对于源自实例的消息,匹配路由必须位于 sys.routes 启动会话的数据库的表中。

Service Broker 确定了消息所对应的服务在当前实例中之后,Service Broker 就必须在该实例中找出此服务。 如果在对话或路由中存在对话的 Service Broker 标识符,则 Service Broker 将消息传递给由该 Service Broker 标识符标识的数据库。

否则,Service Broker 首先通过在包含此对话的数据库中搜索服务名称来查找相应的服务。 然后,它搜索此实例中的其他数据库中的服务名称。 Service Broker 会将消息传递给找到的第一个服务。 但是,Service Broker 在实例中搜索其他数据库的顺序未指定,并且不能保证从会话到会话保持一致。 这意味着,如果实例中存在目标服务的多个副本,则 Service Broker 会随机选取一个服务作为目标。

其他注意事项

为了提高可靠性,Service Broker 路由包含防范路由循环的安全措施。 Service Broker 路由支持数据库镜像,并且可以将对话透明地重定向到镜像数据库的活动方。

路由循环

Service Broker 消息转发跟踪消息转发的次数,以防止出现无限路由循环。 有关详细信息,请参阅 Service Broker 消息转发

如果匹配的路由包含的网络地址解析为当前实例,则 SQL Server 将该对话视为从实例外部发起的对话。 Service Broker 使用 msdb.sys.routes 中的路由对会话消息进行路由。 这些消息的路由确定过程与来自实例外部的消息的路由确定过程相同。 具体而言,必须启用消息转发功能,以便 Service Broker 将消息转发到'LOCAL'以外的网络地址。

镜像地址

从初始匹配路由集中选择路由时,带有镜像地址的路由优先级最高。 但是,在查找会话的匹配路由时,Service Broker 不会特别考虑镜像地址。

当 Service Broker 选择指定镜像地址的路由,并且 Service Broker 以前未使用路由传递消息时,Service Broker 会将请求发送到这两个地址,以确定哪个实例当前是主体。 Service Broker 标识出主体后,Service Broker 会将使用此路由的所有消息都发送到该主体,而不再联系镜像实例。 如果主体无法访问,或者该实例指示它不再是主体,则 Service Broker 会将消息发送到对的另一个地址(如果位于另一个地址的 SQL Server 实例指示它是新主体)。

如果 Service Broker 无法访问主体,但合作伙伴不声明为新主体,Service Broker 不会向合作伙伴发送消息。 然后,Service Broker 会重试主体地址和合作伙伴地址,直到主体可访问,或者合作伙伴指示它现在是主体。 通过采用此方法,Service Broker 在主体和合作伙伴可以通信时可靠地传递消息,但发送消息的实例无法访问主体。