Azure 服务总线是一项完全托管的企业消息代理服务,它提供可靠的异步消息传送功能来分离应用程序和服务。 服务总线支持用于点到点通信的队列,以及用于发布-订阅消息传送模式的主题和订阅。 该服务提供内置的可靠性功能,包括消息持续性、至少一次传递保证和死信队列来处理失败的消息处理。
使用 Azure 时, 可靠性是共同的责任。 Azure 提供了一系列支持复原和恢复的功能。 你负责了解这些功能如何在你使用的所有服务中工作,并选择满足业务目标和运行时间目标所需的功能。
本文介绍如何使服务总线能够灵活应对各种潜在的中断和问题,包括暂时性故障、可用性区域中断和区域中断。 它还重点介绍了有关服务总线服务级别协议(SLA)的一些关键信息。
生产部署建议
Azure Well-Architected Framework 提供了关于可靠性、性能、安全性、成本和操作的建议。 若要了解这些领域如何相互影响并有助于可靠的应用服务解决方案,请参阅 Azure Well-Architected Framework 中 Azure 服务总线的体系结构最佳做法。
可靠性体系结构概述
本部分介绍从可靠性的角度来看,服务工作原理最相关的一些重要方面。 本部分介绍逻辑体系结构,其中包括部署和使用的某些资源和功能。 它还讨论了物理架构,该架构提供了服务内部运作方式的详细信息。
逻辑体系结构
命名空间充当服务总线的管理容器,可配置为使用基本层、标准层或高级层。 可以通过分配容量和配置网络安全,在命名空间级别配置服务。
在命名空间中,部署队列和主题,这些 队列 和 主题是具有不同语义的消息传送实体。 有关详细信息,请参阅服务总线队列、主题和订阅。
可以选择在命名空间上配置 分区 ,该分区将队列和主题分散到多个消息中转站和消息存储中。 命名空间可以使用多个分区来执行并行处理和水平缩放。 服务总线仅保证单个分区内的排序。 分区在应用程序的可靠性设计中起着关键作用。 设计应用程序时,在最大化可用性和一致性之间进行权衡。 对于高级层, 可以在命名空间上启用分区。 对于基本层和标准层命名空间,可以在实体上配置分区,并在 发送消息时根据需要配置分区。
可以使用服务总线及其异步设计方法来提高应用程序的可用性。 有关详细信息,请参阅 异步消息传送模式和高可用性。
物理体系结构
服务总线提供基础计算和存储资源。 对于每个命名空间,多个 消息中转站 处理消息,多个 消息存储 存储消息。 消息存储有三个副本:一个主副本和两个辅助副本。 服务总线使所有这三个副本保持同步,以用于数据和管理操作。 如果主副本发生故障,则可将其中一个辅助副本提升为主副本,而不会产生故障时间。
对于使用“基本”或“标准”层的命名空间,服务总线通过共享的多租户基础结构提供冗余,该基础结构可在可用可用性区域中自动复制消息。 该服务维护多个消息存储器,并确保所有副本在数据和管理操作上保持同步。
对于 高级层命名空间,服务总线提供专用的消息传送单元,每个消息传送单元都有专用的 CPU 和内存资源。 高级层命名空间可以根据工作负荷需求自动缩放。 有关详细信息,请参阅 Azure 服务总线命名空间的自动更新消息传送单元。
服务总线基础结构跨多个物理计算机和机架,这些计算机和机架分布在容错域中,从而降低影响命名空间的灾难性故障的风险。 在具有可用性区域的区域中,基础结构 跨不同的物理数据中心扩展。 该服务实现了透明的故障检测和故障转移机制,使其能够在保证的服务级别内继续运行,并且在发生此类故障时通常不会出现明显的中断。
暂时性故障的复原能力
暂时性故障是指组件发生短暂的间歇性故障。 这些故障经常出现在云之类的分布式环境中,在运营过程中比较常见。 暂时性故障在短时间内自行纠正。 应用程序通常可以通过重试受影响的请求来处理暂时性故障,这一点很重要。
与任何云托管的 API、数据库和其他组件通信时,所有云托管的应用程序都应遵循 Azure 暂时性故障处理指南。 有关详细信息,请参阅 处理暂时性故障的建议。
Azure 服务总线 SDK 包含自动重试逻辑,其中对于因网络超时或临时服务不可用等暂时性原因导致的操作失败,会使用指数退避策略。 当应用程序遇到与服务总线的暂时性断开连接时,SDK 会自动尝试使用配置的重试策略重新连接。
若要优化应用程序中的暂时性故障处理,请使用最新的服务总线 SDK,其中包括最新的重试逻辑和连接管理功能。 有关详细信息,请参阅 适用于 .NET 的 Azure 服务总线客户端库。
应对可用区故障的弹性
可用性区域 是 Azure 区域内物理上独立的数据中心组。 当某个区域发生故障时,服务可以切换到其他可用的区域。
服务总线支持所有服务层级的区域冗余部署。 在受支持的区域中创建服务总线命名空间时,会自动启用区域冗余,无需额外付费。 区域冗余部署模型适用于所有服务总线功能,包括分区和会话。
服务总线以透明方式跨区域中的多个可用性区域复制配置、元数据和消息数据。 区域冗余提供自动故障转移,无需用户进行任何干预。 所有服务总线组件(包括计算、网络和存储)都会跨区域复制。 服务总线拥有足够的容量储备,可以立即应对区域完全丢失的情况。 即使整个可用性区域变得不可用,服务总线也会继续运行,而不会丢失数据或中断消息传送应用程序。
要求
区域支持: 区域冗余服务总线命名空间可以部署到 支持可用性区域的 Azure 区域。 在受支持的区域中创建命名空间时,服务总线会自动启用可用性区域支持,无需其他配置。
层: 所有服务总线层(基本、标准和高级)都支持可用性区域,无需其他要求。
注意事项
服务总线命名空间包括一个 zoneRedundant 属性。 以前,需要此属性才能启用可用性区域,但此行为已更改,并且 zoneRedundant 属性已弃用。 即使启用了区域冗余,此属性仍可能显示 false 。 具有可用性区域的区域中的所有命名空间都区域冗余。
成本
服务总线中的区域冗余不会增加额外的成本。
配置可用性区域支持
在 受支持的区域中部署时,服务总线命名空间会自动支持区域冗余。 无需进一步配置。
所有区域正常时的行为
本部分介绍在为区域冗余配置服务总线命名空间以及所有可用性区域正常运行时的预期情况。
区域之间的流量路由。 服务总线使用主动-主动模型,其中消息分布在多个可用性区域。 客户端连接会跨区域自动负载均衡,服务无论区域如何,都会将操作路由到可用的消息传送基础设施。
区域之间的数据复制。 服务总线在可用性区域之间使用同步复制,包括元数据和消息数据。 消息存储的多个副本在被视为完成之前,必须确认写操作,以确保在正常操作期间跨区域的数据一致性。
区域故障期间的行为
本节介绍在配置服务总线命名空间以实现区域冗余时以及出现可用性区域中断时,预计会出现什么情况。
检测和响应:Azure 会自动检测区域故障,并启动故障转移到健康区域。 区域级故障转移不需要客户采取任何行动。
- 通知:Azure 不会在区域关闭时自动通知你。 但是,可以使用 Azure 服务运行状况 来了解服务的总体运行状况,包括任何区域故障,并且可以设置 服务运行状况警报 来通知问题。
活动请求:在区域故障期间,服务总线可能会删除活动请求。 如果客户在短时间内重试,以适当处理暂时性故障,通常可以避免重大影响。
预期数据丢失:由于服务总线在确认之前跨区域同步复制消息,因此在发生区域故障期间不会发生数据丢失。
预期的停机时间:区域故障可能会导致几秒钟的停机时间。 如果客户在短时间内重试,以适当处理暂时性故障,通常可以避免重大影响。
重新路由流量:服务总线检测到区域丢失,并自动将新请求重定向到一个正常的可用性区域中的另一个副本。
服务总线 SDK 通常以透明方式处理连接管理和重试逻辑。
区域恢复
当可用性区域恢复时,服务总线会自动将区域重新集成到活动服务拓扑中。 恢复的区域开始接受新连接,并与其他区域一起处理消息。 在服务中断期间复制到幸存区域的数据保持不变,所有区域中的正常同步复制都会恢复。 无需采取任何措施进行区域恢复和重新集成。
测试区域故障
服务总线管理区域故障的流量路由、故障转移和区域恢复,因此无需验证可用性区域故障过程或提供进一步的输入。
对区域范围的故障的复原能力
服务总线提供两种类型的多区域支持,这两种支持都需要高级层命名空间:
- 元数据地理灾难恢复在主要区域和次要区域之间提供配置和元数据的主动-被动冗余,但不会复制消息内容。 对于能够自行处理数据复制或不需要数据复制的应用程序,可以考虑使用异地灾难恢复。
元数据 Geo-灾难恢复需要您手动启动次要区域的故障转移或提升,以成为新的主区域。 即使主要区域关闭,Azure 也不会自动执行故障转移或升级。
基本层和标准层中的命名空间不包括内置的多区域功能,但可以通过在不同区域使用多个命名空间来实现应用级别的复制模式。 有关详细信息,请参阅下文的自定义多区域解决方案以增强复原能力。
元数据地理灾难恢复
高级层支持恢复 Geo-Disaster 元数据。 此功能可改善灾难恢复方案,包括区域灾难性损失。 地理灾难恢复仅复制命名空间的配置和元数据。 但是,它不会复制消息数据。 为了支持灾难恢复,此功能可确保预配置另一个区域中的命名空间,并准备好立即接受来自客户端的消息。 异地灾难恢复是一种单向恢复解决方案,不支持故障恢复到之前的主要区域。
元数据地理灾难恢复非常适合那些不严格要求保留每条消息并且能容忍在灾难情况下出现一定数据丢失的应用程序。 元数据地理灾难恢复也可能适用于自行复制数据或无需数据复制的应用程序。 例如,如果你的消息呈现的是大图像,稍后会将其转换为缩略图,那么你可能会认为,如果你能够快速地在另一个区域中恢复处理新消息,并且你可以在以后重建这些消息以赶上进度,那么你可以承受在发生的故障区域中丢失一些消息的情况。
重要
地灾恢复可实现具有相同配置但不复制消息数据的业务连续性。
当您配置元数据地理灾难恢复时,创建客户端应用程序要连接的别名。 别名是一个 FQDN,默认情况下将所有流量定向到主命名空间。
如果主要区域发生故障或发生其他类型的灾难,可以随时手动启动从主要区域到次要区域的单向故障转移。 可以选择执行安全故障转移,该选项会等待复制完成后再切换到次要区域,但可能无法在区域中断期间使用。 故障转移一旦开始,几乎立即就能完成。 在故障转移过程中,异地灾难恢复别名会重新指向辅助命名空间,且配对关系会被移除。
本章节总结了地质灾害恢复的重要方面。 查看完整的文档以了解其工作原理。 有关详细信息,请参阅 服务总线地理灾难恢复。
要求
区域支持: 可以选择任何支持服务总线作为主要命名空间或辅助命名空间的 Azure 区域。 无需使用 Azure 配对区域,因此可以根据延迟、符合性或数据驻留要求选择次要区域。
层: 若要启用元数据地理灾难恢复,这两个命名空间都必须使用高级层。
分区: 无法将分区命名空间与非分区命名空间配对。
元数据 Geo-Disaster Recovery: 无法将命名空间配置为同时使用 Geo-Replication 和 Geo-Disaster Recovery。
注意事项
角色分配: Microsoft Entra 主命名空间中实体的基于角色的访问控制(RBAC)分配不会复制到辅助命名空间。 在辅助命名空间中手动创建角色分配,以保护对它们的访问。
应用程序设计: 在设计客户端应用程序时,地理灾难恢复需要具体的注意事项。 有关详细信息,请参阅 注意事项。
专用终结点: 如果使用专用终结点连接到命名空间,请在主要区域和次要区域中配置网络。 有关详细信息,请参阅专用终结点。
从标准迁移到高级命名空间: 如果命名空间以前位于标准层中,并且已将其迁移到高级层,则需要以不同的方式处理别名。 有关详细信息,请参阅 服务总线标准版到高级版。
成本
启用元数据地理灾害恢复功能时,您需要为主命名空间和辅助命名空间付费。
配置多区域支持
容量计划和管理
规划多区域部署时,如果一个区域发生故障,请确保这两个区域有足够的容量来处理完整负载。 次要区域在正常运行期间保持被动状态,但故障转移后必须立即处理流量。 规划如何缩放辅助命名空间容量,以便它可以不延迟地接收生产流量。 如果在故障转移过程中可以容忍额外的停机时间,则可以选择在故障转移期间或故障转移后缩放辅助命名空间容量。 若要减少停机时间,请提前在辅助命名空间中预配容量,使其仍可接收生产负载。
当所有区域都正常时的行为
本部分介绍为异地灾难恢复配置服务总线命名空间且主要区域处于运行状态时的预期情况。
区域之间的流量路由: 客户端应用程序通过命名空间的地理灾难恢复(Geo-Disaster Recovery)别名进行连接,流量路由到主要区域中的主命名空间。
在正常作期间,只有主命名空间主动处理来自客户端的消息。 辅助命名空间在备用模式下保持被动状态,访问数据的任何请求都失败。
区域之间的数据复制: 仅配置元数据在命名空间之间复制。 配置复制持续且异步。
所有消息数据仅保留在主命名空间中,不会复制到辅助命名空间。
区域中断期间的行为
本节内容描述了在将服务总线命名空间配置为地理灾难恢复时,以及主要区域发生中断时的预期情况。
检测和响应: 你负责监视区域运行状况并手动启动故障转移。 即使主要区域关闭,Azure 也不会自动执行故障转移或升级次要区域。
有关如何启动故障转移的详细信息,请参阅 故障转移流。
启动故障转移时,选择是执行 安全故障转移 还是执行标准(强制 故障转移或 手动故障转移)。 在故障转移开始之前,安全的故障转移会等待复制完成到次要区域。 此方法可减少元数据丢失,但会导致停机。 安全故障转移要求命名空间位于同一 Azure 订阅中。
在主区域发生故障时,通常需要执行强制故障切换。 如果主要区域可用,而你出于其他原因触发故障转移,则可以选择计划故障转移。
故障转移是一项单向操作,因此之后需要重新建立异地灾难恢复配对关系。 有关详细信息,请参阅 区域恢复。
- 通知:Azure 不会在区域关闭时自动通知你。 但是,可以使用 Azure 服务运行状况 来了解服务的总体运行状况,包括任何区域故障,并且可以设置 服务运行状况警报 来通知问题。
活动请求: 在故障转移启动时,正在进行的活动请求将终止。 客户端应用程序应在故障转移完成后重试操作。
预期数据丢失:
元数据: 配置和元数据通常复制到辅助命名空间。 但元数据复制是异步进行的,因此最近的更改可能不会复制,尤其是复杂的更改。 在客户端访问辅助命名空间之前验证辅助命名空间的配置。
消息数据: 消息数据不会在区域之间复制。 如果主要区域出现故障,则主命名空间中的消息将变为不可用。
除非灾难性灾难导致主要区域完全丢失,否则消息不会永久丢失。 如果区域恢复,则可以稍后从主命名空间检索消息。
预计停机时间:故障转移通常在 5 到 10 分钟内完成。 客户端可能需要更长的时间才能完全复制和更新 DNS 条目。
流量重新路由: 使用 Geo-Disaster Recovery 别名连接到命名空间的客户端会在故障转移后自动重定向到辅助命名空间。 但是,此重定向取决于 DNS 服务器是否如实遵循命名空间 DNS 记录的 TTL,以及客户端接收到这些已更新的 DNS 记录。
区域恢复
原始主要区域恢复后,你必须手动重新建立配对关系,并可选择执行故障恢复操作。 新建异地灾难恢复配对,将恢复的区域设为次要区域,如果想返回原始区域,请再次执行故障转移。 此过程涉及发送到暂时主节点的消息的潜在数据丢失。
如果灾难导致主要区域中所有区域丢失,则可能无法恢复数据。 在其他情况下,你的消息数据将在故障转移恢复之前保留在主要命名空间中。 还原访问后,可以从旧的主命名空间获取历史消息。 你负责配置应用程序以接收和处理这些消息。 Azure 不会自动将其还原到次要区域。
针对区域故障进行测试
若要测试你的响应流程和灾难恢复流程,可在维护时段内执行计划的故障转移。 启动从主命名空间到辅助命名空间的故障转移,并验证应用程序是否可以连接和处理来自新主命名空间的消息。
监视故障转移的持续时间,并验证运行手册和自动化程序是否正常运作。 测试后,可以将系统切回到原始配置。
了解故障转移过程中及故障转移后可能遇到的潜在停机时间和数据丢失情况。 在一个反映生产命名空间配置的非生产环境中,测试元数据的地理灾难恢复。
用于复原的自定义多区域解决方案
Geo-Replication 和 Geo-Disaster Recovery 提供应对区域中断和其他问题的恢复能力,并且适用于大多数工作负荷。 但是,在以下情况下,它们可能不符合你的需求:
- 你对自定义复制或同时维护多个活动区域有要求。
- 使用不支持这些功能的服务总线层。
在服务总线中,有一系列设计模式可以实现不同类型的多区域支持。 许多模式需要部署多个命名空间,并配置应用程序以适当地使用命名空间。 若要了解详细信息,请参阅以下文章:
服务维护期间的系统弹性能力
服务总线执行定期维护。 在计划内维护期间,命名空间将移动到包含最新更新的冗余节点。 发生此移动时,客户端 SDK 会在命名空间上自动断开连接并重新连接。 通常,升级发生在 30 秒内。 应用程序必须为维护期间可能发生的任何暂时性网络断开做好准备。
有关详细信息,请参阅 Azure 服务总线的 Azure 维护事件指南。
备份和还原
服务总线不是为数据的长期存储而设计的。 通常,数据在短时间内存储在主题或队列中,然后被处理或持久化到另一个数据存储系统中,之后才会被删除。 由于此设计,服务总线会自动维护消息数据的副本,但不为消息数据提供备份和还原功能。
对于需要长期消息保留的方案,请考虑实现到 Azure 存储或其他持久存储服务的应用程序级存档。
服务级别协议
Azure 服务的服务级别协议 (SLA) 描述了每个服务的预期可用性,以及解决方案为实现该可用性预期而必须满足的条件。 有关详细信息,请参阅 联机服务的 SLA。
服务总线为所有命名空间提供 SLA(服务水平协议)。 当命名空间满足以下所有条件时,可用性 SLA 更高:
- 它使用高级版本。
- 它位于具有可用性区域的区域中。
- 它使用分区。