Nello script precedente abbiamo parlato della gestione degli errori, in una comunicazione gRPC, attraverso l'utilizzo di una retry policy. Questa, configurata al momento della creazione del canale, permette di gestire un possibile errore di comunicazione e riprovare autonomamente dopo il tempo prestabilito.
Un'altra modalità, disponibile con ASP.NET Core 6 e non cumulabile con la retry policy, è la creazione di una hedging policy. Diversamente da quanto visto fin ora, lo scopo di questa policy è di eseguire più volte la stessa chiamata in parallelo, senza attendere una risposta, per poi restituire il primo risultato utile, solo quando una di queste risulterà completata con successo.
Come possiamo già intuire non tutte le chiamate possono essere effettuate con questa logica, ma solamente quelle che, anche se ripetute, non variano lo stato dell'applicazione, come l'aggiornamento di un oggetto o il settaggio di un valore a true o false, viceversa non è adatto per operazioni additive o di eliminazione. Inoltre questa pratica potrebbe aumentare il carico sul server, dato che verranno eseguite sempre lo stesso numero di chiamate.
Vediamo come abilitare la hedging policy attraverso la class MethodConfig
var defaultMethodConfig = new MethodConfig { Names = { MethodName.Default }, HedgingPolicy = new HedgingPolicy { MaxAttempts = 5, HedgingDelay = TimeSpan.FromSeconds(3), NonFatalStatusCodes = { StatusCode.Unavailable } } }; var channel = GrpcChannel.ForAddress("https://localhost:5001", new GrpcChannelOptions { ServiceConfig = new ServiceConfig { MethodConfigs = { defaultMethodConfig } } });
La configurazione permette il settaggio di vari parametri:
- MaxAttemps: numero totale di chiamate eseguite, inclusa l'originale
- HedgingDelay: tempo di attesa, successivo alla prima chiamata, prima di effettuare le rimanenti. Default: 0
- NonFatalStatusCodes: errore consentiti, nel caso in cui venga ricevuto un errore dichiarato in questa proprietà il flusso di hedge calls proseguirà, viceversa verrà restituito all'applicazione interrompendo tutte le chiamate
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Effettuare lo stream della risposta in ASP.NET Core tramite IAsyncEnumerable
.NET Conference Italia 2023
Effettuare chiamate con versioning da Blazor ad ASP.NET Core
Mascherare l'output di un valore all'interno dei log di un workflow di GitHub
Load test di ASP.NET Core con k6
Creazione di plugin per Tailwind CSS: espandere le Funzionalità del Framework
Eseguire una query su SQL Azure tramite un workflow di GitHub
Utilizzare i primary constructor in C#
Miglioramenti nelle performance di Angular 16
Usare un KeyedService di default in ASP.NET Core 8
Come migrare da una form non tipizzata a una form tipizzata in Angular
Disabilitare automaticamente un workflow di GitHub (parte 2)