Polly:un framework per tentativi basati su criteri di errori transitori in C#

Polly:un framework per tentativi basati su criteri di errori transitori in C#

Negli ultimi post abbiamo esaminato due modi per gestire gli errori transitori. Il primo post ha mostrato come possiamo scrivere una logica di ripetizione personalizzata per errori transitori con back-off esponenziale. Il secondo post ha mostrato come possiamo personalizzare il blocco di gestione degli errori temporanei di Microsoft Azure per gestire gli errori temporanei.

In questo post finale, esamineremo Polly, una libreria che consente agli sviluppatori di esprimere le politiche di gestione delle eccezioni transitorie in modo fluente maniera. La Libreria offre molte opzioni pronte all'uso per riprovare gli errori transitori, tra cui Riprova, Riprova per sempre, Riprova e attendi, Attendi e riprova per sempre e Interruttore automatico . Questo è davvero interessante perché puoi semplicemente esprimere la tua intenzione di utilizzare una delle meccaniche di ripetizione in modo fluente e fidarti del framework sottostante per fare il lavoro pesante per te. Non sono necessari loop personalizzati o blocchi try/catch !!!

L'obiettivo

Il nostro compito rimane invariato rispetto ai post precedenti, ovvero presentare una richiesta non autenticata a https://microsoft.sharepoint.com che genera un'eccezione web. Lo snippet di codice è di seguito:

        static void ExecuteHTTPGetWithFlowThroughException(string requestUri)
        {
            Console.WriteLine(DateTime.Now);
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(requestUri);
            request.KeepAlive = false;
            request.Method = "GET";

            HttpWebResponse webResponse = (HttpWebResponse)request.GetResponse();
            int requestStatus = (int)webResponse.StatusCode;
            webResponse.Close();
        }

Requisiti di sistema

  1. Dobbiamo riprovare solo su WebExceptions
  2. Dobbiamo riprovare tre volte
  3. Dobbiamo utilizzare il back-off esponenziale

Polly si occuperà immediatamente di tutti i requisiti.

Guida passo passo all'integrazione di Polly

Passaggio n. 1 Ottieni il pacchetto Nuget

Apri VS2012 (o successivo) -> Fai clic con il pulsante destro del mouse sulla tua soluzione -> Seleziona "Gestisci pacchetti Nuget per soluzione" -> Cerca " Polly" (schermata sotto) -> fai clic su "Installa"

Passaggio n. 2:aggiungi una direttiva using per Polly all'inizio del tuo file di codice

   using Polly;

Passaggio n. 3:definisci il criterio di rilevamento e riprova

Dovrai specificare quale tipo di eccezioni deve essere riprovato e come deve essere gestito il nuovo tentativo. In questo caso siamo interessati a riprovare solo per le eccezioni web. Vogliamo anche riprovare 3 volte e aumentare esponenzialmente il tempo di attesa tra i tentativi.

Lo snippet di codice di seguito lo fa. Le parti evidenziate riflettono l'implementazione dei nostri requisiti.

    var policy = Policy.Handle()
                               .WaitAndRetry(
                                    3,
                                    retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt)),
                                    (exception, timeSpan, context) =>
                                    {
                                        Console.WriteLine("Encountered exception {0}", exception.Message);
                                    });

Passaggio 4:esegui la norma

Infine, esegui il criterio passandogli la tua funzione personalizzata da eseguire.

   policy.Execute(() => ExecuteHTTPGetWithFlowThroughException("https://microsoft.sharepoint.com"));

Quindi dovrei usare Polly o il blocco di gestione degli errori transitori o utilizzare una logica di ripetizione personalizzata?

Personalmente mi è piaciuto Polly perché è semplicissimo da usare e rende molto chiare le intenzioni del programmatore. Puoi anche concatenare tutte le azioni abbastanza facilmente in modo fluido.

Usa il blocco dell'applicazione per la gestione dei guasti transitori se ti piace un modello di programmazione con interfaccia più strutturata. Inoltre, se hai a che fare con i servizi di Azure, questa è la strada da percorrere.

Se hai solo bisogno di un'azione di ripetizione una tantum, sentiti libero di copiare e incollare il codice dal mio post precedente.