通过自动转发串联服务总线实体

通过服务总线自动转发功能可将队列或订阅链接到作为相同命名空间组成部分的另一个队列或主题。 启用自动转发时,服务总线会自动删除放置在第一个队列或订阅(源)中的消息,并将其放入第二个队列或主题(目标)中。 仍可将消息直接发送到目标实体。

注意

服务总线 基本层不支持自动转发。 有关各层级之间的差异,请参阅服务总线定价

创建源实体时,目标实体必须存在。 如果目标实体不存在,则当创建源实体时,服务总线将返回异常。

场景

横向扩展单个主题

可以使用自动转发对单个主题进行横向扩展。 服务总线将特定主题的订阅数量限制为 2,000。 可通过创建二级主题来容纳其他订阅。 即使不受服务总线的订阅数限制,添加二级主题也可提高主题的整体吞吐量。

自动转发方案示意图,显示了通过订单主题处理的消息,该消息可分支到三个二级订单主题中的任意一个。

分离消息发送方与接收方

自动转发还可用于分离消息发送方与接收方。 例如,考虑一个由以下三个模块组成的企业资源规划 (ERP) 系统:订单处理、库存管理和客户关系管理。 这些模块中的每一个都会生成消息,并将其加入相应主题的队列中。 John Doe 和 Jane 是两名销售代表,他们想了解与其客户相关的所有消息。 若要接收这些消息,John Doe 和 Jane Doe 各自都会创建一个个人队列,并在每个 ERP 主题上创建一个订阅,以便自动将所有消息转发到各自的队列中。

自动转发方案示意图,显示了三个处理模块通过三个相应的主题将消息发送到两个单独的队列。

如果 Alice 去度假,消息会进入她的个人队列,而不是 ERP 主题。 此方案中,由于销售代表未接收到任何消息,因此没有任何 ERP 主题会达到配额。

注意

设置自动转发时,源实体上 AutoDeleteOnIdle 的值会自动设置为数据类型的最大值。

  • 在源端,自动转发充当接收操作,因此启用了自动转发的源永远不会真正“空闲”,所以它不会被自动删除。
  • 自动转发不会对目标实体进行任何更改。 如果在目标实体上启用了 AutoDeleteOnIdle,则当实体在指定的空闲时间间隔内处于非活动状态时,会自动删除该实体。 建议不要在目标实体上启用 AutoDeleteOnIdle,因为如果目标实体被删除,源实体在尝试转发目标消息时会不断出现异常。

自动转发注意事项

  • 服务总线不允许在启用自动转发的源实体上创建消息接收器。
  • 如果目标实体累积了过多消息并超出配额,或禁用了目标实体,则源实体会将消息添加到其死信队列,直到目标中存在可用空间(或重新启用了该实体)。 这些消息仍保留在死信队列中,因此你必须显式地从死信队列中接收并处理这些消息。
  • 将各个主题连接到一起以获取具有多个订阅的复合主题时,推荐第一级别主题上具有中等数量的订阅,第二级别主题上具有多个订阅。 例如,一个包含 20 个订阅的一级主题(其中每个订阅都链接到包含 200 个订阅的二级主题)就能够比包含 200 个订阅的一级主题(其中每个订阅链接到包含 20 个订阅的二级主题)具有更高的吞吐量。
  • 服务总线对每条转发的消息按一次操作计费。 例如,将一条消息发送到一个包含 20 个订阅(每个订阅配置为将消息自动转发到另一队列或主题)的主题,如果所有第一级别的订阅都接收到此消息的副本,则会作为 21 次操作进行计费。
  • 若要创建链接到另一个队列或主题的订阅,则订阅创建者必须具有源和目标实体的管理权限。 将消息发送到源主题仅需要源主题的发送权限。
  • 请勿创建超过 4 个跃点的链。 超过 4 跳的消息将转为死信。 当消息从一个队列或主题自动转发到另一个队列或主题时,消息的跃点计数会递增。 在通过传输队列发送消息的 send via 场景中,消息的跃点数也会增加。
  • 启用会话的队列或订阅不支持自动转发。
  • 源队列会尝试按接收的顺序将消息转发到目标实体,但目标可能是不支持排序的主题。 如果源实体或目标实体是分区实体,则不保证顺序。

自动转发和指标

当一条消息被成功自动转发时,该消息会计入目标实体的 传入消息 指标。 源实体的 “传出消息 ”指标不包括自动转发的消息。

如果自动转发尝试失败,因为目标已启用会话或遇到暂时性错误,服务总线重试发送。 到达目标的每次重试都会在目标的 传入消息 指标中计数,因此,重试的一条源消息可以在目标的传入计数中生成多个条目。

当目标实体被删除或被禁用时,源实体会将该消息转入死信队列,并且目标实体上不会记录任何传入计数。

有关 服务总线 指标的完整列表,请参阅监视数据参考

若要了解如何通过不同方式(Azure 门户、PowerShell、CLI、Azure 资源管理模板等)启用或禁用自动转发,请参阅为队列和订阅启用自动转发