#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 использует эту реализацию. Пользовательская стратегия повторных попыток может использовать другую реализацию