你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

Azure Key Vault 限制指南

限制是启动的一个过程,用于限制对 Azure 服务的并发调用数,以防止过度使用资源。 Azure Key Vault(AKV)旨在处理大量请求。 如果出现大量请求,限制客户端的请求有助于保持 AKV 服务的最佳性能和可靠性。

根据场景,限速限制会有所不同。 例如,如果正在执行大量写入,则发生限制的可能性会比仅执行读取高。

Key Vault 如何处理其限制?

Key Vault 中的服务限制可防止滥用资源,并确保所有 Key Vault 客户端的服务质量。 超过服务阈值时,Key Vault 会限制来自该客户端的任何进一步请求,返回 HTTP 状态代码 429(请求过多),请求失败。 返回代码为 429 的失败请求不计入 Key Vault 跟踪的速率限制。

Key Vault 最初设计用于在部署时存储和检索机密。 随着技术的发展,Key Vault 现在越来越多地在运行时用于存储和检索机密。 许多应用程序和服务使用类似于数据库的 Key Vault。 但是,当前服务限制不旨在支持此类高吞吐量方案。

Key Vault 最初是使用 Azure Key Vault 服务限制中指定的限制创建的。 若要最大程度地提高 Key Vault 吞吐量速率,下面是一些用于最大化吞吐量的建议准则/最佳做法:

  1. 确保限制已到位。 客户端必须遵循针对 429 状态的指数退避策略,并确保按照指导执行重试。
  2. 将 Key Vault 流量划分到多个保管库和不同区域。 为每个安全/可用性域使用单独的保管库。 如果有五个应用,每个应用位于两个区域中,则建议设置10个保管库,每个保管库包含特定于应用和区域的机密。 所有事务类型的订阅范围限制是单个密钥保管库限制的五倍。 例如,每个订阅的 HSM-其他事务数限制为 10 秒内 5,000 个事务。 考虑在服务或应用中缓存机密,以便同时减少 Key Vault 的直接 RPS,并/或处理基于突发的流量。 还可以将流量划分到不同的区域,以最大程度地减少延迟并使用不同的订阅/保管库。 不要向单个 Azure 区域中的 Key Vault 服务发送超过订阅限制的内容。
  3. 在内存中缓存从 Azure Key Vault 检索到的机密,并尽可能从内存中重复使用。 仅当缓存的副本停止工作(例如,因为它已在源中轮换)时,才从 Azure Key Vault 重新读取。
  4. Key Vault 专为保护您自身服务的机密信息而设计。 如果要存储客户的机密(尤其是对于高吞吐量密钥存储方案),请考虑将密钥放入具有加密的数据库或存储帐户中,并仅将主密钥存储在 Azure Key Vault 中。
  5. 对于加密、包装和验证等公钥作,请通过缓存公钥材料在本地执行这些作,而无需访问 Key Vault。 此方法不仅可降低限制的风险,还能提高应用程序的可靠性。
  6. 如果使用 Key Vault 存储服务的凭据,请检查该服务是否支持Microsoft Entra 身份验证来直接进行身份验证。 这减少了 Key Vault 上的负载,提高了可靠性,并简化了代码,因为 Key Vault 现在可以使用 Microsoft Entra 令牌。 许多服务现在使用 Microsoft Entra 身份验证。 请参阅 支持 Azure 资源的托管标识的服务中的当前列表。
  7. 请考虑在较长时间内交错负载/部署,以保持在当前的 RPS 限制之下。
  8. 如果应用包含多个需要读取一个或多个相同机密的节点,请考虑使用扇出模式,其中一个实体从 Key Vault 读取机密,并向所有节点扇出。 仅在内存中缓存检索到的机密。

如何针对服务限制来限制应用

以下是在服务受到限制时应实现 的最佳做法

  • 减少每个请求的操作数。
  • 减少请求的频率。
  • 避免立即重试。
    • 发出的所有请求要符合使用限制。

实现应用的错误处理时,请使用 HTTP 错误代码 429 检测是否需要限制客户端。 如果请求再次失败并出现 HTTP 429 错误代码,仍遇到 Azure 服务限制。 继续使用建议的客户端限制方法,在请求成功之前重试请求。

下面是实现指数退避的代码:

SecretClientOptions options = new SecretClientOptions()
    {
        Retry =
        {
            Delay= TimeSpan.FromSeconds(2),
            MaxDelay = TimeSpan.FromSeconds(16),
            MaxRetries = 5,
            Mode = RetryMode.Exponential
         }
    };
    var client = new SecretClient(new Uri("https://keyVaultName.vault.azure.net"), new DefaultAzureCredential(),options);
                                 
    //Retrieve Secret
    secret = client.GetSecret(secretName);

在客户端 C# 应用程序中使用此代码非常简单。

出现 HTTP 错误代码 429 时,请使用指数延迟方法开始限制客户端:

  1. 等待 1 秒,然后重试请求
  2. 如果仍受限制,请等待 2 秒,然后重试请求
  3. 如果仍受限制,请等待 4 秒,然后重试请求
  4. 如果仍受限制,请等待 8 秒,然后重试请求
  5. 如果仍受限制,请等待 16 秒,然后重试请求

此时,应不会收到 HTTP 429 响应代码。

另请参阅

若要深入了解 Microsoft 云中的限制,请参阅限制模式