Sto usando Entity Framework Core 2.2 e ho deciso di seguire alcuni suggerimenti sul blog e abilitare un nuovo tentativo in caso di errore:
services.AddDbContext<MyDbContext>( options =>
options.UseSqlServer(Configurations["ConnectionString"]),
sqlServerOptionsAction: sqlOptions =>
{
sqlOptions.EnableRetryOnFailure(
maxRetryCount: 10,
maxRetryDelay: TimeSpan.FromSeconds(5),
errorNumbersToAdd: null);
});
La mia domanda è: a cosa serve l'argomento maxRetryDelay
? Mi aspetto che sia il tempo di ritardo tra i tentativi, ma il nome implica che è il tempo massimo, significa che posso fare i miei 10 tentativi a distanza di 1 secondo e non di 5 secondi se lo desidero?
Il ritardo tra i tentativi viene randomizzato fino al valore specificato da maxRetryDelay
.
Questo viene fatto per evitare che si verifichino più tentativi contemporaneamente e schiacciando un server. Immagina, ad esempio, 10 K di richieste a un servizio Web che non funzionano a causa di un problema di rete e che riprovano contemporaneamente dopo 15 secondi. Il server di database riceverà un'ondata improvvisa di query da 15 KB.
Randomizzando il ritardo, i tentativi vengono distribuiti nel tempo e nel client.
Il ritardo per ogni nuovo tentativo viene calcolato da ExecutionStragegy.GetNextDelay . La fonte mostra che è un backoff esponenziale casuale.
La SqlServerRetryingExecutionStrategy predefinita utilizza tale implementazione. Una strategia di tentativi personalizzati potrebbe utilizzare un'implementazione diversa