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 筆交易。 請考慮快取服務或應用程式中的祕密,以減少直接傳到金鑰保存庫的 RPS 及 (或) 處理高載型流量。 您也可以將流量分散到不同區域,以將延遲降至最低,並使用不同的訂閱/保存庫。 請勿將超過訂閱限制的流量傳送到單一 Azure 區域中的 Key Vault 服務。
  3. 在記憶體中快取您從 Azure Key Vault 擷取的祕密,並盡可能從記憶體重複使用。 只有當快取複本停止運作 (例如已在來源輪換) 時,才會從 Azure Key Vault 重新讀取。
  4. Key Vault 適用於您自己的服務祕密。 如果您要儲存客戶的祕密 (尤其是高輸送量金鑰儲存體),請考慮將金鑰放在加密的資料庫或儲存體帳戶中,並只將主要金鑰儲存在 Azure Key Vault 中。
  5. 加密、包裝和驗證公開金鑰的作業可在無 Key Vault 存取權的情況下執行,這不僅可降低節流的風險,還可改善可靠性 (前提是您正確地快取公開金鑰材料)。
  6. 如果您使用 Key Vault 儲存服務的認證,請檢查該服務是否支援 Azure AD 驗證直接進行驗證。 這可降低 Key Vault 的負載、提升可靠性並簡化您的程式碼,因為 Key Vault 現在可以使用 Azure AD 權杖。 許多服務都已改用 Azure AD Auth。請參閱支援使用受控識別存取 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 Cloud 上進行節流處理的詳細資訊,請參閱節流模式 \(英文\)。