服务总线 自动转发功能将队列或订阅链连接到同一命名空间内的其他队列或主题。 当你启用自动转发时,服务总线 会自动从第一个队列或订阅(源)中移除消息,并将其放到第二个队列或主题(目的地)。 你仍然可以直接向目标实体发送消息。
注意
服务总线 基本层不支持自动转发。 有关各层级之间的差异,请参阅服务总线定价。
创建源实体时,目标实体必须存在。 如果目标实体不存在,则当创建源实体时,服务总线将返回异常。
场景
横向扩展单个主题
可以使用自动转发对单个主题进行横向扩展。 服务总线将特定主题的订阅数量限制为 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 场景中,消息的跃点数也会增加。
- 启用会话的队列或订阅不能是自动转发的 源 :单个实体不能同时启用会话支持和自动转发,因此在启用会话的队列或订阅上设置
ForwardTo失败。 不过,支持自动转发 到 启用会话的目标。 转发的消息保留其会话 ID,因此目标可以是启用会话的队列(或具有已启用会话的订阅的主题)。 源实体上没有会话 ID 的转发消息是死信的,因为启用会话的实体仅接受具有会话 ID 的消息。 - 源队列会尝试按接收的顺序将消息转发到目标实体,但目标可能是不支持排序的主题。 如果源实体或目标实体是分区实体,则不保证顺序。
自动转发和指标
当一条消息被成功自动转发时,该消息会计入目标实体的 传入消息 指标。 源实体的 “传出消息 ”指标不包括自动转发的消息。
如果自动转发尝试失败,因为目标已启用会话或遇到暂时性错误,服务总线重试发送。 到达目标的每次重试都会在目标的 传入消息 指标中计数,因此,重试的一条源消息可以在目标的传入计数中生成多个条目。
当目标实体被删除或被禁用时,源实体会将该消息转入死信队列,并且目标实体上不会记录任何传入计数。
有关 服务总线 指标的完整列表,请参阅监视数据参考。
自动转发吞吐量和消息大小
自动转发将每个消息从源实体移动到目标实体。 与直接发送和接收一样,消息大小影响消息传输速度:较小的消息转发更快,因此尽可能保持消息较小。 对于大容量或大负载工作负载,规划容量以使目的地与源头同步。
随着消息长度增加,请牢记以下几点:
- 最大消息大小因层级而异。 标准 允许最高256 KB。 高级层默认最多允许 1 MB,或者在通过 AMQP 启用大消息支持时最多允许 100 MB。 由于标准版消息限制为256 KB,大型负载主要适用于高级版。
- 将源实体的最大大小设置得足够大,以便在消息转发期间能够短暂容纳这些消息。 如果源实体达到其大小配额,服务总线 将拒绝发往该实体的新消息,直到转发腾出空间为止,因此应将其容量设置为足以吸收预期的突发消息流量。
注意
自动转发不会改变最大消息大小或任何配额。 它会在你已设定好大小的实体之间传递消息。 根据工作负载产生的吞吐量和消息大小,为源实体和目标端确定适当的容量。
Recommendations
为使自动转发在处理大型或高吞吐量工作负载时保持高效:
- 尽量将转发消息精简到切实可行的程度。 大号消息发送和接收时间更长,因此降低端到端转发吞吐量。
- 将源实体的最大容量设置为足以吸收短时突发流量,这样即使转发暂时变慢,也不会立即触及配额上限。
- 确保目标实体能以源转发的速度接收数据。 慢或积压的目的地限制了源的耗尽速度,如果目的地达到配额或被禁用,源会对无法转发的消息 写成死符 。
- 在高级层中,请根据工作负载所需的消息大小和速率,分配足够的消息传送单元。
排查自动转发缓慢问题
如果消息比预期更长时间才出现在目标实体,请进行以下检查:
| 症状 | 可能的原因 | 需要检查的事项 |
|---|---|---|
| 目标端接收消息缓慢,源端队列深度持续增加 | 源端转发速度比接收速度慢 | 将源实体的活跃消息数量随时间与目的地的 入信 指标进行比较。 检查平均消息大小,以及目标端是否能跟上处理速度。 |
| 源实体达到其配额上限并拒绝新的传入消息 | 消息在源端的积累速度快于转发速度 | 根据该源的大小配额检查其大小,然后减小消息大小或提高该源的最大大小限制。 |
| 消息会出现在源的死信队列中 | 源无法转发,因为目的地已满、禁用或删除 | 确认目标存在、已启用且未超出其配额,然后处理源的死信队列。 |
| 仅部分实体的转发速度较慢 | 这些特定链上存在大负载,或目标端出现积压 | 检查受影响实体的消息大小分布和目标运行状况。 |
常见的缓解措施:
- 保持信息简洁。 大消息会降低吞吐量并增加延迟。
- 增加源实体的最大体积以吸收爆发。
- 调整目的地的消费者,使其流失速度与源头前进速度相当。
- 在高级套餐中,添加消息单元。
Tip
目的地的 “入信” 指标计入成功转发的消息数。 将该数据与源实体在同一窗口内的活跃消息数量进行比较,可以判断转发是否能跟上进来流量。 有关完整指标列表,请参见 监控数据参考。
相关内容
若要了解如何通过不同方式(Azure 门户、PowerShell、CLI、Azure 资源管理模板等)启用或禁用自动转发,请参阅为队列和订阅启用自动转发。