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
Usare una container image come runner di GitHub Actions
Hosting di componenti WebAssembly in un'applicazione Blazor static
Sfruttare i KeyedService in un'applicazione Blazor in .NET 8
Esporre i propri servizi applicativi con Semantic Kernel e ASP.NET Web API
Gestione degli stili CSS con le regole @layer
Aprire una finestra di dialogo per selezionare una directory in WPF e .NET 8
Disabilitare automaticamente un workflow di GitHub (parte 2)
Eseguire operazioni sui blob con Azure Storage Actions
Migliorare la scalabilità delle Azure Function con il Flex Consumption
Gestire i dati con Azure Cosmos DB Data Explorer
Miglioramenti agli screen reader e al contrasto in Angular
Ottimizzare la latenza in Blazor 8 tramite InteractiveAuto render mode