Azure Key Vault のスロットル ガイダンスAzure Key Vault throttling guidance

スロットルは、Azure サービスに対する同時呼び出し数を制限し、リソースの過剰使用を防止することを目的に開始されるプロセスです。Throttling is a process you initiate that limits the number of concurrent calls to the Azure service to prevent overuse of resources. Azure Key Vault (AKV) は、大量の要求を処理できるように設計されていますが、Azure Key Vault (AKV) is designed to handle a high volume of requests. 処理しきれない数の要求が発生した場合、クライアントの要求をスロットルすることで、AKV サービスのパフォーマンスと信頼性を最適な状態に保つことができます。If an overwhelming number of requests occurs, throttling your client's requests helps maintain optimal performance and reliability of the AKV service.

スロットルの制限は、シナリオによって異なります。Throttling limits vary based on the scenario. たとえば大量の書き込みを実行している場合、読み取りだけを実行している場合と比べて、スロットルの余地は大きくなります。For example, if you are performing a large volume of writes, the possibility for throttling is higher than if you are only performing reads.

Key Vault における制限の扱いHow does Key Vault handle its limits?

リソースの乱用を防ぎ、Key Vault の全クライアントのサービス品質を確保するために、Key Vault にはサービス制限があります。Service limits in Key Vault are there to prevent misuse of resources and ensure quality of service for all of Key Vault’s clients. サービスのしきい値を超えると、Key Vault はそれ以降、一定時間そのクライアントからの要求を制限します。When a service threshold is exceeded, Key Vault limits any further requests from that client for a period of time. この状態になると、Key Vault からは HTTP 状態コード 429 (要求が多すぎます) が返され、要求は失敗します。When this happens, Key Vault returns HTTP status code 429 (Too many requests), and the requests fail. また、Key Vault によって追跡されているスロットル制限には、429 が返されて失敗した要求も加算されます。Also, failed requests that return a 429 count towards the throttle limits tracked by Key Vault.

業務上の正当な理由でスロットル制限の引き上げを希望される場合は、Microsoft にお問い合わせください。If you have a valid business case for higher throttle limits, please contact us.

サービス制限に対応してアプリをスロットルする方法How to throttle your app in response to service limits

サービスがスロットルされているときに実践すべきベスト プラクティスを次に示します。The following are best practices you should implement when your service is throttled:

  • 要求あたりの操作の数を減らす。Reduce the number of operations per request.
  • 要求の頻度を減らす。Reduce the frequency of requests.
  • すぐに再試行しない。Avoid immediate retries.
    • すべての要求が使用制限のカウント対象になります。All requests accrue against your usage limits.

アプリのエラー処理を実装するときに、HTTP エラー コード 429 を使って、クライアント側でのスロットルの必要性を検出してください。When you implement your app's error handling, use the HTTP error code 429 to detect the need for client-side throttling. HTTP 429 エラー コードで再び要求が失敗すれば、Azure のサービス制限が引き続き適用されます。If the request fails again with an HTTP 429 error code, you are still encountering an Azure service limit. それ以降は、推奨されているクライアント側のスロットル手法を使用して、成功するまで要求を再試行してください。Continue to use the recommended client-side throttling method, retrying the request until it succeeds.

エクスポネンシャル バックオフを実装するコードを次に示します。Code that implements exponential backoff is shown below.

    public sealed class RetryWithExponentialBackoff
    {
        private readonly int maxRetries, delayMilliseconds, maxDelayMilliseconds;

        public RetryWithExponentialBackoff(int maxRetries = 50,
            int delayMilliseconds = 200,
            int maxDelayMilliseconds = 2000)
        {
            this.maxRetries = maxRetries;
            this.delayMilliseconds = delayMilliseconds;
            this.maxDelayMilliseconds = maxDelayMilliseconds;
        }

        public async Task RunAsync(Func<Task> func)
        {
            ExponentialBackoff backoff = new ExponentialBackoff(this.maxRetries,
                this.delayMilliseconds,
                this.maxDelayMilliseconds);
            retry:
            try
            {
                await func();
            }
            catch (Exception ex) when (ex is TimeoutException ||
                ex is System.Net.Http.HttpRequestException)
            {
                Debug.WriteLine("Exception raised is: " +
                    ex.GetType().ToString() +
                    " –Message: " + ex.Message +
                    " -- Inner Message: " +
                    ex.InnerException.Message);
                await backoff.Delay();
                goto retry;
            }
        }
    }

    public struct ExponentialBackoff
    {
        private readonly int m_maxRetries, m_delayMilliseconds, m_maxDelayMilliseconds;
        private int m_retries, m_pow;

        public ExponentialBackoff(int maxRetries, int delayMilliseconds,
            int maxDelayMilliseconds)
        {
            m_maxRetries = maxRetries;
            m_delayMilliseconds = delayMilliseconds;
            m_maxDelayMilliseconds = maxDelayMilliseconds;
            m_retries = 0;
            m_pow = 1;
        }

        public Task Delay()
        {
            if (m_retries == m_maxRetries)
            {
                throw new TimeoutException("Max retry attempts exceeded.");
            }
            ++m_retries;
            if (m_retries < 31)
            {
                m_pow = m_pow << 1; // m_pow = Pow(2, m_retries - 1)
            }
            int delay = Math.Min(m_delayMilliseconds * (m_pow - 1) / 2,
                m_maxDelayMilliseconds);
            return Task.Delay(delay);
        }
    }

このコードは、クライアントの C# アプリケーションで使用するのが簡単です。Using this code in a client C# application is straightforward. 次の例では HttpClient クラスを使用して方法を示します。The following example shows how, using the HttpClient class.

public async Task<Cart> GetCartItems(int page)
{
    _apiClient = new HttpClient();
    //
    // Using HttpClient with Retry and Exponential Backoff
    //
    var retry = new RetryWithExponentialBackoff();
    await retry.RunAsync(async () =>
    {
        // work with HttpClient call
        dataString = await _apiClient.GetStringAsync(catalogUrl);
    });
    return JsonConvert.DeserializeObject<Cart>(dataString);
}

このコードは概念実証にしか適していないことに注意してください。Remember that this code is suitable only as a proof of concept.

HTTP エラー コード 429 が発生したら、次のように指数関数的バックオフ手法を使ってクライアントのスロットルを開始します。On HTTP error code 429, begin throttling your client using an exponential backoff approach:

  1. 1 秒待って要求を再試行Wait 1 second, retry request
  2. 引き続きスロットルされる場合は 2 秒待って要求を再試行If still throttled wait 2 seconds, retry request
  3. 引き続きスロットルされる場合は 4 秒待って要求を再試行If still throttled wait 4 seconds, retry request
  4. 引き続きスロットルされる場合は 8 秒待って要求を再試行If still throttled wait 8 seconds, retry request
  5. 引き続きスロットルされる場合は 16 秒待って要求を再試行If still throttled wait 16 seconds, retry request

通常は、この時点で HTTP 429 応答コードは発生しなくなります。At this point, you should not be getting HTTP 429 response codes.

関連項目See also

Microsoft Cloud のスロットルに関するさらに詳しい情報については、「Throttling Pattern (スロットル パターン)」を参照してください。For a deeper orientation of throttling on the Microsoft Cloud, see Throttling Pattern.