Le Azure Function sono il servizio FaaS della piattaforma Microsoft che ci permettono di scrivere codice che venga eseguito senza preoccuparci del numero di istanze dei server e della capacità computazionale che mettiamo a disposizione. La loro esecuzione viene attivata tramite timer, tramite richieste HTTP o tramite input che possono variare in maniera non deterministica. Ne sono un esempio i messaggi delle code o i blob dello storage. Il vantaggio delle Function è la possibilità di usare piani a consumo che ci permettano di scalare orizzontalmente automaticamente. Lo stesso possiamo fare con un service plan riservato con l'ausilio dell'autoscale.
Ogni istanza carica il nostro codice e lo esegue, ma anche a livello dell'istanza stessa dobbiamo sapere sfruttare al meglio la CPU e la RAM messa a disposizione.
Normalmente è necessario impostare quindi se lavorare in batch e quanti elementi caricare contemporaneamente (come il caso di MaxConcurrentCalls del Service Bus Trigger), ma di recente è stata inserita la possibilità di adattare dinamicamente la concorrenza in funzione di come le nostre function si comportano.
Per sfruttare questa caratteristica è necessario aggiornare le librerie Microsoft.Azure.WebJobs.Extensions.* dei nostri trigger alla versione 5. Successivamente dobbiamo modificare il file host.json, che troviamo già disponibile inserendo i seguenti flag.
{ "version": "2.0", "concurrency": { "dynamicConcurrencyEnabled": true, "snapshotPersistenceEnabled": true } }
Il primo indica appunto di abilitare la concorrenza dinamica, il secondo di persistere le decisioni prese. Il motore parte, infatti, con una concorrenza bassa a 1 e alza livello in base alle prestazioni e al carico in coda. Le decisioni vengono memorizzate sul blob per permettere in caso di riavvio dell'istanza di partire con l'ultima decisione presa. Se abilitiamo il log, possiamo vedere queste decisioni sotto la categoria Host.Concurrency e capire, in unione alle prestazioni, se la concorrenza dinamica migliori il nostro applicativo.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Migliorare i tempi di risposta di GPT tramite lo streaming endpoint in ASP.NET Core
Ordine e importanza per @layer in CSS
Creare una libreria CSS universale: Immagini
Introduzione alle Container Queries
Utilizzare l'espressione if inline in una pipeline di Azure DevOps
Migliorare l'organizzazione delle risorse con Azure Policy
La gestione della riconnessione al server di Blazor in .NET 9
Generare un hash con SHA-3 in .NET
Rinnovare il token di una GitHub App durante l'esecuzione di un workflow
Utilizzare Locust con Azure Load Testing
Usare i settings di serializzazione/deserializzazione di System.Text.Json di ASP.NET all'interno di un'applicazione non web
Conoscere il rendering Server o WebAssembly a runtime in Blazor