Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
限制是启动的一个过程,用于限制对 Azure 服务的并发调用数,以防止过度使用资源。 Azure 密钥保管库(AKV)旨在处理大量请求。 如果出现大量请求,限制客户端的请求有助于保持 AKV 服务的最佳性能和复原能力。
节流限制因情况而异。 例如,如果正在执行大量写入,则发生限流的可能性会比仅执行读取大。
密钥保管库如何处理其限制?
密钥保管库中的服务限制可防止滥用资源,并确保所有密钥保管库客户端的服务质量。 超过服务阈值时,密钥保管库限制来自该客户端的任何进一步请求,返回 HTTP 状态代码 429(请求过多),请求失败。 返回 429 的失败请求不计入密钥保管库跟踪的限制限制。
密钥保管库最初设计用于在部署时存储和检索机密。 随着技术的发展,密钥保管库现在越来越多地在运行时用于存储和检索机密。 许多应用程序和服务使用类似于数据库的密钥保管库。 但是,当前服务限制不旨在支持此类高吞吐量方案。
密钥保管库最初是使用 Azure 密钥保管库 服务限制中指定的限制创建的。 若要最大程度地提高密钥保管库吞吐量速率,下面是一些用于最大程度地提高吞吐量的建议准则/最佳做法:
- 确保限制已到位。 客户端必须遵循针对 429 状态的指数退避策略,并确保按照指导执行重试。
- 将您的 密钥保管库 流量划分到多个密钥保管库和不同地区。 为每个安全性/可用性域使用单独的保管库。 如果你有 5 个应用,每个应用已划分到 2 个区域,则我们建议配置 10 个保管库,其中每个保管库包含应用和区域特有的机密。 所有事务类型的订阅范围限制是单个 Key Vault 限制的 5 倍。 例如,每个订阅的 HSM-其他事务数限制为 10 秒内 5,000 个事务。 考虑在服务或应用中缓存机密,以便减少对 Key Vault 的直接请求数(RPS),并/或处理突发流量。 还可以将流量划分到不同的区域,以最大程度地减少延迟并使用不同的订阅/保管库。 不要在单个 Azure 区域向 密钥保管库 服务发送超过订阅限制的请求。
- 缓存从内存中Azure 密钥保管库检索的机密,并尽可能从内存中重复使用。 仅当缓存复制停止工作(例如,因为它在源处旋转)时,才从Azure 密钥保管库重新读取。
- 密钥保管库专为自己的服务机密而设计。 如果要存储客户的机密(尤其是对于高吞吐量密钥存储方案),请考虑将密钥置于具有加密的数据库或存储帐户中,并将主密钥仅存储在Azure 密钥保管库中。
- 对于加密、包装和验证等公钥操作,请在本地执行这些操作,而无需通过缓存公钥材料来访问密钥保管库。 此方法不仅可降低限制风险,还能提高应用程序的复原能力。
- 如果使用密钥保管库存储服务的凭据,请检查该服务是否支持Microsoft Entra身份验证来直接进行身份验证。 这样可以减少密钥保管库负载、提高可靠性并简化代码,因为密钥保管库现在可以使用Microsoft Entra令牌。 许多服务现在使用Microsoft Entra身份验证。 请参阅在 支持 Azure 资源托管身份的服务 上的当前列表。
- 考虑在一个较长的时间段内错开负载/部署,使其不会超过当前的 RPS 限制。
- 如果应用包含需要读取一个或多个相同机密的多个节点,请考虑使用扇出模式,其中一个实体从密钥保管库读取机密,并将扇出到所有节点。 仅在内存中缓存检索的机密。
如何针对服务限制来限制应用
以下是在服务受到限制时应实施的最佳做法:
- 减少每个请求的操作数。
- 减少请求频率。
- 避免立即重试。
- 所有请求都会计入你的使用限制。
实现应用的错误处理时,请使用 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.cn"), new DefaultAzureCredential(),options);
//Retrieve Secret
secret = client.GetSecret(secretName);
在客户端 C# 应用程序中使用此代码很简单。
推荐的客户端限制方法
出现 HTTP 错误代码 429 时,请使用指数延迟方法开始限制客户端:
- 等待 1 秒,然后重试请求
- 如果仍受限流,请等待2秒,然后重试请求。
- 如果仍受限制,请等待 4 秒,再发起请求
- 如果仍受限制,请等待 8 秒,然后重试请求
- 如果仍然限流,请等待 16 秒后重试请求
此时,应不会收到 HTTP 429 响应代码。