你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
Azure 应用配置 可帮助你存储应用程序的配置设置。 通过使用应用配置,可以更轻松地实现 外部配置存储模式。 本文介绍使用多租户系统时有用的应用配置的某些功能。 提供的链接提供了有关如何在多租户解决方案中使用应用配置的指南和示例。
隔离模型
存储是指应用配置服务的单个实例。
在多租户解决方案中,通常有两种类型的设置:
- 共享设置:应用于多个租户,例如全局设置或应用于 部署戳中所有租户的设置。 最好在共享应用配置存储中存储全局设置。 遵循此方法可以最大程度地减少当设置值更改时需要更新的位置数。 此方法还可以最大限度地减少设置不同步的风险。 
- 特定于租户的设置:指定每个租户的数据库名称或内部标识符。 可以使用这些设置为每个租户指定不同的日志级别。 例如,可以诊断特定租户报告的问题,并且只需要从该租户收集诊断日志。 可以选择是将多个租户的租户特定设置合并到单个存储中,还是为每个租户部署存储。 根据你的要求做出决定。 如果您的解决方案为多个租户使用一个共享的应用层,那么使用租户特定的存储可能没有显著优势。 但是,如果你部署租户特定的应用程序实例,则可以选择通过部署租户特定的配置存储来依样遵循相同的方法。 
下表总结了应用配置的主要租赁隔离模型之间的差异。
| 注意事项 | 共享存储 | 按租户存储 | 
|---|---|---|
| 数据隔离 | 低。 使用密钥前缀或标签来标识每个租户的数据。 | 高 | 
| 性能隔离 | 低 | 高 | 
| 部署复杂性 | 低 | 中等到高 | 
| 操作复杂性 | 低 | 中等到高 | 
| 资源成本 | 低 | 中等到高 | 
| 示例方案 | 具有共享应用程序层的大型多租户解决方案 | 具有完全隔离的部署的高级租户 | 
共享存储
可以为整个解决方案部署共享应用配置存储,也可以为每个标记部署一个。 然后,你可以将同一个存储用于所有租户的设置。 使用 键前缀 或 标签 来区分它们。
如果需要存储每个租户的大量数据,或扩展到大量租户,则可能面临超出 单个存储的资源限制的风险。 在此场景中,请考虑是否可以通过一组共享的商店共享租户,以最大程度减少部署和管理成本。
如果采用此方法,请确保了解适用的资源配额和限制。 具体而言,请注意所使用的服务层级的总存储限制,并确保不超过每小时的最大请求数。
按租户存储
你也可以选择为每个租户部署应用配置存储。 应用配置 标准层 可帮助你在订阅中部署无限数量的商店。 但这种方法通常更为复杂,因为随后必须部署和配置更多资源。
如果你面临以下情况之一,请考虑部署租户特定的存储:
- 需要使用 客户管理的密钥(CMK),其中每个租户的密钥都是独立的。
- 租户要求其配置数据与其他租户的数据隔离。 应用配置的访问权限在应用商店级别进行控制,因此,通过部署单独的存储,可以配置单独的访问权限。
支持多租户的应用配置功能
在多租户应用程序中使用应用配置时,可以使用这些功能来存储和检索特定于租户的设置。
键前缀
在应用配置中,可以使用表示应用程序设置的键值对。 键表示配置设置的名称。 可为键使用分层命名结构。 在多租户解决方案中,请考虑使用租户标识符作为键的前缀。
例如,假设你需要存储某个设置来指示应用程序的日志记录级别。 在单租户解决方案中,可将此设置命名为 LogLevel。 在多租户解决方案中,可以选择使用分层键名,例如将 tenant1/LogLevel 用于租户 1,将 tenant2/LogLevel 用于租户 2,依此类推。
可以在层次结构中指定长键名称和多个级别。 如果选择使用长密钥名称,请确保了解 键和值的大小限制。
将单个租户的配置加载到应用程序时,可以指定键前缀筛选器以便仅加载该租户的键。 还可以配置应用程序配置的提供程序库,以 从密钥中剪裁密钥前缀 ,然后再使其可供应用程序使用。 当你剪裁键前缀时,在该租户的值已加载到应用程序的情况下,应用程序会看到一致的键名。
标签
应用配置还支持 标签。 使用标签,可以定义使用同一键的单独值。
标签有助于版本控制、使用多个部署环境,或者出于解决方案中的其他目的。 虽然可以将租户标识符用作标签,但不能将标签用于其他任何内容。 因此,对于多租户解决方案,通常最好使用 密钥前缀 来管理特定于租户的设置,并出于其他目的使用标签。
如果决定对每个租户使用标签,则应用程序只能使用 标签筛选器加载特定租户的设置。 如果为每个租户部署单独的应用程序部署,此方法非常有用。
应用程序端缓存
使用应用配置时,请务必在应用程序中缓存设置,而不是每次使用设置时加载这些设置。 应用配置提供程序库缓存设置并自动刷新它们。
还必须确定应用程序是加载单个租户的设置,还是加载所有租户的设置。
随着租户群的增长,一同加载所有租户的设置所需的时间和内存量可能也会增长。 因此,在大多数情况下,最好是在应用程序需要每个租户的设置时单独加载这些设置。
如果单独加载每个租户的配置设置,应用程序需要单独缓存每个设置集, 在 .NET 应用程序中,可以使用 内存中缓存来缓存 租户 IConfiguration 的对象,然后使用租户标识符作为缓存密钥。 通过使用内存中缓存,无需为每个请求重新加载配置,但如果应用程序处于内存压力下,缓存可以删除未使用的实例。 还可为每个租户的配置设置配置过期时间。
贡献者
Microsoft维护本文。 以下参与者撰写了本文。
主要作者:
- John Downs |Azure 模式和做法的主要软件工程师
其他参与者:
- 阿森·弗拉基米尔斯基|首席工程师,FastTrack for Azure
- 王振兰 |主要软件工程管理器,应用配置
若要查看非公开的LinkedIn个人资料,请登录LinkedIn。