你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
Azure 服务总线在不一定同时联机的应用程序和服务之间提供高度可靠和异步的云消息传送。 服务总线是一个完全托管的企业级消息代理,支持消息队列和发布-订阅主题。 本文介绍对多租户解决方案有用的服务总线功能。 它还提供了可帮助规划如何使用服务总线的资源。
隔离模型
使用使用服务总线的多租户系统时,需要决定要采用的隔离级别。 服务总线支持多个隔离模型。
下表总结了服务总线的主要租赁模型之间的差异。
| 注意事项 | 每个租户的命名空间 | 每个租户的共享命名空间或单独的主题或队列 | 租户之间的共享命名空间、主题或队列 |
|---|---|---|---|
| 数据隔离 | 高 | 中等 | 没有 |
| 性能隔离 | 最高。 根据每个租户的要求管理性能需求。 | 中等。 可能受到喧闹的邻居问题的影响。 | 低。 可能受到喧闹的邻居问题的影响。 |
| 部署复杂性 | 中等。 请注意订阅级别的 Azure 服务总线配额和限制。 | 中等。 必须为每个租户单独部署消息实体。 请注意命名空间级别的 服务总线配额和限制 。 | 低 |
| 操作复杂性 | 高。 为每个租户单独管理命名空间。 | 中等。 可能需要对消息实体进行精细管理,具体取决于租户。 | 低 |
| 示例方案 | 每个租户的单个应用程序实例 | 每个租户的专用队列 | 具有共享应用程序层和一个或多个共享队列和主题的大型多租户解决方案 |
每个租户的专用命名空间
在解决方案中,可以为每个租户使用特定的服务总线命名空间。 此部署方法为解决方案提供最大隔离级别和为每个租户提供一致的性能的能力。
还可以使用以下方法根据每个租户的需求微调消息传送功能:
将命名空间部署到靠近租户的区域。
使用适合租户的价格层级部署租户专属的命名空间。 例如,可以预配具有不同数量的消息传送单元(MU)的高级命名空间。
根据租户的需求应用网络限制。
使用 特定于租户的加密密钥。
这种隔离模型的缺点是,随着一段时间内系统中租户数的增长,管理命名空间的作复杂性也会增加。 如果达到每个 Azure 订阅的最大命名空间数,则可以跨不同的订阅部署命名空间。 有关详细信息,请参阅 部署戳模式。 此方法还会增加资源成本,因为你为预配的每个命名空间付费。
在共享命名空间中分隔主题和队列
可以在消息传送实体级别隔离租户。 例如,系统中的每个租户可以有一个或多个与之交互的专用队列。 可以使用不同的共享访问签名或Microsoft Entra 标识对每个租户的消息实体进行身份验证和授权。
随着系统中租户数的增长,队列、主题或订阅的数量也会增加,以适应每个租户。 这种增长可能会导致更高的运营成本和较低的组织敏捷性。
由于命名空间在所有租户之间共享,因此此方法更有可能遇到 干扰邻居问题 。 例如,单个租户的消息传送实体可能会消耗不成比例的命名空间资源,并影响所有其他租户。 服务总线命名空间在 MU 容量和与命名空间的并发连接数方面存在限制。 考虑单个租户是否可能消耗超过这些资源的公平份额。
有限制在单个命名空间中可以预配的主题和队列的数量。 但是,这些限制高于订阅中的命名空间限制。
共享主题或队列
对所有租户使用相同的命名空间和消息传送实体来降低运营复杂性并降低资源成本。 它还可以解锁高级消息传送和 筛选 方案。
但是,让所有租户共享的单个命名空间也会导致 干扰邻居问题,这可能会导致某些租户延迟较高。 还需要使应用程序代码能够感知多租户。 例如,可以在消息有效负载内或在用户定义的属性中传递租户上下文。 此方法使你能够正确处理适用于不同租户的消息。 服务总线提供主题筛选器和操作,可用于定义特定订阅者应接收的消息。 使用共享主题或队列时,租户之间没有数据隔离,因此需要在应用程序逻辑中实现数据隔离要求。
注释
会话 是支持消息排序要求的有用功能。 但是,它们通常不用于在租户之间隔离数据,除非你还要求在租户内进行消息排序。 对于大多数多租户解决方案,请考虑使用本文中所述的其他隔离模型之一。
支持多租户的服务总线功能
Microsoft Entra 身份验证
Service Bus 与 Microsoft Entra ID 集成。 此集成允许客户端使用 Microsoft Entra ID 向服务总线资源验证托管标识。 服务总线定义一组内置角色,可授予租户访问服务总线实体的权限。 例如,可以使用 Microsoft Entra 身份验证授予租户对包含其消息的特定队列或主题的访问权限。 此方法将其与应用程序中的其他租户隔离开来。
有关详细信息,请参阅 使用 Microsoft Entra ID 对托管标识进行身份验证以访问服务总线资源。
客户管理的密钥
如果租户需要使用自己的密钥来加密和解密消息,可以在服务总线高级命名空间中配置客户管理的密钥。 此功能要求您采用“每租户专用命名空间”隔离模型。
有关详细信息,请参阅 配置客户管理的密钥以加密服务总线静态数据。
共享访问签名
通过共享访问签名,你可以向租户授予对具有特定权限的服务总线资源的访问权限。 如果选择在消息传递实体级别隔离租户,则可以在仅适用于特定租户的队列或主题上授予共享访问签名密钥。
如需了解更多信息,请参阅以下文章:
主题筛选器和操作
如果在命名空间中使用服务总线主题,则可以使用主题过滤器和操作来允许订阅者定义他们想要从主题接收的消息。 每个规则都有一个筛选条件来选择所需的邮件,并且包含一个标注邮件的动作。 例如,如果您的主题订阅是按租户划分的,您可以使用筛选器接收仅针对该租户的主题消息。
有关详细信息,请参阅主题筛选器和操作。
暂停和重新激活消息传递实体
可以暂停消息传送实体。 暂挂会将消息实体置于禁用状态,并且所有消息都保留在存储中。 在处理 租户生命周期时,停用消息传送实体的功能非常有用。 例如,如果某个租户取消订阅产品,则可以禁用特定于该特定租户的队列。
有关详细信息,请参阅暂停和重新激活消息传送实体(禁用)。
分区
您可以通过将消息分布到多个消息传输代理和消息存储,使用分区来提高消息实体的吞吐量。
可以通过将消息的分区键设置为该租户的标识符,将分区分配给特定租户。 此方法可确保服务总线将消息分配给该租户的分区。 但是,服务总线对可以在单个实体上支持的分区数有限制。 对于共享实体,请考虑使用源于租户 ID 的分区键。 例如,可以使用哈希算法将租户 ID 转换为固定数量的分区键。
使用特定 SKU 部署命名空间时,可以使用分区。 有关详细信息,请参阅 服务总线高级消息层级 和 分区队列和主题。
MUs 的自动更新
服务总线高级命名空间可以自动调整分配给命名空间的 MU 数。 启用此功能以允许命名空间根据负载弹性缩放。 弹性缩放在共享命名空间多租户设计中非常有用,以减少 干扰邻居问题 的风险,而无需手动干预。
有关详细信息,请参阅自动更新服务总线命名空间的 MU。
供稿人
Microsoft维护本文。 以下参与者撰写了本文。
主要作者:
- Will Velida | FastTrack for Azure 客户工程师 2
其他参与者:
- John Downs |Azure 模式和做法的主要软件工程师
- Daniel Larsen | FastTrack for Azure 首席客户工程师
- Paolo Salvatori | FastTrack for Azure 首席客户工程师
- 丹尼尔·斯科特-伦斯福德 |合作伙伴解决方案架构师、数据与 AI
- 阿森·弗拉基米尔斯基 | 客户首席工程师,FastTrack for Azure
若要查看非公开的LinkedIn个人资料,请登录LinkedIn。