При настройке RetryOnFailure каков параметр maxRetryDelay

#entity-framework-core

#entity-framework-core

Вопрос:

Я использую Entity Framework Core 2.2, и я решил следовать некоторым предложениям в блоге и включить повторную попытку при сбое:

 services.AddDbContext<MyDbContext>( options =>
    options.UseSqlServer(Configurations["ConnectionString"]),
    sqlServerOptionsAction: sqlOptions =>
    {
        sqlOptions.EnableRetryOnFailure(
        maxRetryCount: 10,
        maxRetryDelay: TimeSpan.FromSeconds(5),
        errorNumbersToAdd: null);
    });
  

Мой вопрос в том, для чего используется maxRetryDelay аргумент?
Я бы ожидал, что это будет время задержки между повторными попытками, но название подразумевает его максимальное время, означает ли это, что я могу выполнить свои 10 попыток с интервалом в 1 секунду, а не с интервалом в 5 секунд, как я желаю?

Комментарии:

1. Представьте, что 10 ТЫСЯЧ запросов одновременно завершаются ошибкой. Вы хотите забить сервер 10 тысячами повторных попыток через 5 секунд? Или вы бы предпочли, чтобы они были распределены по? Что, если повторные попытки завершаются неудачей 1 или 2 раза, вы хотите использовать ту же задержку повторных попыток? Или вы предпочли бы подождать немного дольше во второй или третий раз?

Ответ №1:

Задержка между повторными попытками рандомизируется до значения, указанного maxRetryDelay .

Это сделано, чтобы избежать одновременных повторных попыток, которые перегружают сервер. Представьте, например, что 10 ТЫСЯЧ запросов к веб-службе завершаются сбоем из-за проблемы с сетью и повторяют попытку одновременно через 15 секунд. Сервер базы данных получит внезапную волну запросов 15 Тыс.

При случайной настройке задержки повторные попытки распределяются по времени и клиенту.

Задержка для каждой повторной попытки вычисляется с помощью ExecutionStragegy.GetNextDelay. Источник показывает, что это случайное экспоненциальное отклонение.

По умолчанию SqlServerRetryingExecutionStrategy использует эту реализацию. Пользовательская стратегия повторных попыток может использовать другую реализацию