Procedure consigliate per le prestazioni e l'affidabilità delle funzioni di AzureBest practices for performance and reliability of Azure Functions

Questo articolo fornisce indicazioni per migliorare le prestazioni e l'affidabilità delle app per le funzioni senza server.This article provides guidance to improve the performance and reliability of your serverless function apps.

Questo articolo definisce le procedure consigliate per creare e definire l'architettura di soluzioni senza server tramite Funzioni di Azure.The following are best practices in how you build and architect your serverless solutions using Azure Functions.

Evitare funzioni con esecuzione prolungataAvoid long running functions

Le funzioni con esecuzione prolungata e di grandi dimensioni possono causare problemi di timeout imprevisti.Large, long-running functions can cause unexpected timeout issues. Per altre informazioni sui timeout per un piano di hosting specifico, vedere durata del timeout dell'appper le funzioni.To learn more about the timeouts for a given hosting plan, see function app timeout duration.

Una funzione può diventare grande a causa di molte dipendenze Node.js.A function can become large because of many Node.js dependencies. L'importazione delle dipendenze può anche fare aumentare i tempi di caricamento causando timeout imprevisti.Importing dependencies can also cause increased load times that result in unexpected timeouts. Le dipendenze vengono caricate in modo sia esplicito che implicito.Dependencies are loaded both explicitly and implicitly. Un singolo modulo caricato dal codice potrebbe caricare i propri moduli aggiuntivi.A single module loaded by your code may load its own additional modules.

Quando è possibile, suddividere le funzioni di grandi dimensioni in gruppi di funzioni più piccoli che possono interagire tra loro e restituire rapidamente le risposte.Whenever possible, refactor large functions into smaller function sets that work together and return responses fast. Ad esempio, un webhook o una funzione di trigger HTTP potrebbe richiedere una risposta di riconoscimento entro un determinato limite di tempo; è comune che i webhook richiedano una risposta immediata.For example, a webhook or HTTP trigger function might require an acknowledgment response within a certain time limit; it's common for webhooks to require an immediate response. È possibile passare il payload del trigger HTTP in una coda perché venga elaborato da una funzione di trigger della coda.You can pass the HTTP trigger payload into a queue to be processed by a queue trigger function. Questo approccio consente di rinviare il lavoro effettivo e restituire una risposta immediata.This approach lets you defer the actual work and return an immediate response.

Comunicazioni tra funzioniCross function communication

Le funzioni permanenti e le app per la logica di Azure sono progettate per gestire transazioni di stato e comunicazioni tra più funzioni.Durable Functions and Azure Logic Apps are built to manage state transitions and communication between multiple functions.

Se non si usa Durable Functions o app per la logica per l'integrazione con più funzioni, è preferibile usare le code di archiviazione per la comunicazione tra funzioni.If not using Durable Functions or Logic Apps to integrate with multiple functions, it's best to use storage queues for cross-function communication. Il motivo principale è che le code di archiviazione sono più convenienti e molto più semplici da effettuare il provisioning rispetto ad altre opzioni di archiviazione.The main reason is that storage queues are cheaper and much easier to provision than other storage options.

Le dimensioni dei singoli messaggi in una coda di archiviazione sono limitate a 64 KB.Individual messages in a storage queue are limited in size to 64 KB. Se è necessario passare messaggi di dimensioni superiori tra le funzioni, è possibile usare una coda del bus di servizio di Azure per supportare dimensioni dei messaggi fino a 256 kB al livello Standard e fino a 1 MB al livello Premium.If you need to pass larger messages between functions, an Azure Service Bus queue could be used to support message sizes up to 256 KB in the Standard tier, and up to 1 MB in the Premium tier.

Gli argomenti del bus di servizio sono utili se è necessario filtrare i messaggi prima dell'elaborazione.Service Bus topics are useful if you require message filtering before processing.

Gli hub eventi sono utili per supportare comunicazioni con volumi elevati.Event hubs are useful to support high volume communications.

Scrivere le funzioni in modo che siano senza statoWrite functions to be stateless

Le funzioni devono essere senza stato e idempotenti se possibile.Functions should be stateless and idempotent if possible. Associare ai dati le eventuali informazioni di stato necessarie.Associate any required state information with your data. Ad esempio, un ordine in fase di elaborazione probabilmente ha un membro state associato.For example, an order being processed would likely have an associated state member. Una funzione può elaborare un ordine basato su tale stato rimanendo però una funzione senza stato.A function could process an order based on that state while the function itself remains stateless.

Le funzioni idempotenti sono consigliate in particolare con i trigger timer.Idempotent functions are especially recommended with timer triggers. Se, ad esempio, si dispone di un elemento che deve essere assolutamente eseguito una volta al giorno, scriverlo in modo che possa essere eseguito in qualsiasi momento durante il giorno con gli stessi risultati.For example, if you have something that absolutely must run once a day, write it so it can run anytime during the day with the same results. La funzione può essere chiusa quando non è disponibile alcun lavoro per un determinato giorno.The function can exit when there's no work for a particular day. Anche se un'esecuzione precedente non è stata completata, l'esecuzione successiva riprenderà da dove era stata interrotta.Also if a previous run failed to complete, the next run should pick up where it left off.

Scrivere funzioni difensiveWrite defensive functions

Si supponga che la funzione possa rilevare un'eccezione in qualsiasi momento.Assume your function could encounter an exception at any time. Progettare le funzioni con la possibilità di continuare da un punto di errore precedente durante l'esecuzione successiva.Design your functions with the ability to continue from a previous fail point during the next execution. Si consideri uno scenario che richiede le azioni seguenti:Consider a scenario that requires the following actions:

  1. Eseguire una query per 10.000 righe in un database.Query for 10,000 rows in a database.
  2. Creare un messaggio in coda per ognuna delle righe da elaborare ulteriormente in un secondo tempo.Create a queue message for each of those rows to process further down the line.

A seconda della complessità del sistema, è possibile che si verifichino problemi di funzionamento dei servizi downstream, interruzioni della rete o limiti di quota raggiunti e così via. Tutti questi possono influire sulla funzione in qualsiasi momento.Depending on how complex your system is, you may have: involved downstream services behaving badly, networking outages, or quota limits reached, etc. All of these can affect your function at any time. È necessario progettare le funzioni in modo che siano preparate.You need to design your functions to be prepared for it.

Come reagisce il codice in caso di errore dopo l'inserimento di 5.000 di tali elementi in una coda per l'elaborazione?How does your code react if a failure occurs after inserting 5,000 of those items into a queue for processing? Tenere traccia degli elementi in un set già completato.Track items in a set that you’ve completed. In caso contrario, è possibile inserirli di nuovo la volta successiva.Otherwise, you might insert them again next time. Questo doppio inserimento può avere un notevole effetto sul flusso di lavoro, quindi rendere le funzioni idempotente.This double-insertion can have a serious impact on your work flow, so make your functions idempotent.

Se un elemento della coda è già stato elaborato, consentire alla funzione di essere no-op.If a queue item was already processed, allow your function to be a no-op.

Sfruttare le misure difensive già messe a disposizione per i componenti usati nella piattaforma Funzioni di Azure.Take advantage of defensive measures already provided for components you use in the Azure Functions platform. Ad esempio, vedere Gestione di messaggi della coda non elaborabili nella documentazione relativa a trigger e associazioni della coda di Archiviazione di Azure.For example, see Handling poison queue messages in the documentation for Azure Storage Queue triggers and bindings.

Procedure consigliate per l'organizzazione delle funzioniFunction organization best practices

Come parte della soluzione, è possibile sviluppare e pubblicare più funzioni.As part of your solution, you may develop and publish multiple functions. Queste funzioni vengono spesso combinate in una singola app per le funzioni, ma possono anche essere eseguite in app per le funzioni separate.These functions are often combined into a single function app, but they can also run in separate function apps. Nei piani di hosting Premium e dedicato (servizio app), più app per le funzioni possono condividere anche le stesse risorse eseguendo nello stesso piano.In Premium and dedicated (App Service) hosting plans, multiple function apps can also share the same resources by running in the same plan. Il modo in cui si raggruppano le funzioni e le app per le funzioni può influito sulle prestazioni, il ridimensionamento, la configurazione, la distribuzione e la sicurezza della soluzione complessiva.How you group your functions and function apps can impact the performance, scaling, configuration, deployment, and security of your overall solution. Non esistono regole applicabili a tutti gli scenari, quindi considerare le informazioni contenute in questa sezione durante la pianificazione e lo sviluppo di funzioni.There aren't rules that apply to every scenario, so consider the information in this section when planning and developing your functions.

Organizzare le funzioni per le prestazioni e la scalabilitàOrganize functions for performance and scaling

Ogni funzione creata ha un footprint di memoria.Each function that you create has a memory footprint. Sebbene questo footprint sia in genere di piccole dimensioni, la presenza di un numero eccessivo di funzioni all'interno di un'app per le funzioni può comportare un avvio più lento dell'app nelle nuove istanze.While this footprint is usually small, having too many functions within a function app can lead to slower startup of your app on new instances. Significa anche che l'utilizzo della memoria complessiva dell'app per le funzioni potrebbe essere superiore.It also means that the overall memory usage of your function app might be higher. È difficile pronunciare il numero di funzioni in una singola app, che dipende dal carico di lavoro specifico.It's hard to say how many functions should be in a single app, which depends on your particular workload. Tuttavia, se la funzione archivia una grande quantità di dati in memoria, è consigliabile disporre di un minor numero di funzioni in una singola app.However, if your function stores a lot of data in memory, consider having fewer functions in a single app.

Se si eseguono più app per le funzioni in un piano Premium singolo o in un piano dedicato (servizio app), queste app vengono tutte ridimensionate insieme.If you run multiple function apps in a single Premium plan or dedicated (App Service) plan, these apps are all scaled together. Se si dispone di un'app per le funzioni con un requisito di memoria molto più elevato rispetto alle altre, viene usata una quantità sproporzionata di risorse di memoria in ogni istanza in cui viene distribuita l'app.If you have one function app that has a much higher memory requirement than the others, it uses a disproportionate amount of memory resources on each instance to which the app is deployed. Poiché questo potrebbe lasciare meno memoria disponibile per le altre app in ogni istanza, potrebbe essere necessario eseguire un'app per le funzioni a memoria elevata, come questa, nel proprio piano di hosting separato.Because this could leave less memory available for the other apps on each instance, you might want to run a high-memory-using function app like this in its own separate hosting plan.

Nota

Quando si usa il piano a consumo, è consigliabile inserire sempre ogni app nel proprio piano, perché le app vengono ridimensionate in modo indipendente.When using the Consumption plan, we recommend you always put each app in its own plan, since apps are scaled independently anyway.

Valutare se si desidera raggruppare le funzioni con profili di carico diversi.Consider whether you want to group functions with different load profiles. Se, ad esempio, si dispone di una funzione che elabora molte migliaia di messaggi della coda e un altro che viene chiamato solo occasionalmente ma con requisiti di memoria elevati, potrebbe essere necessario distribuirli in app per le funzioni separate in modo da ottenere i propri set di risorse e ridimensionarsi in modo indipendente l'uno dall'altro.For example, if you have a function that processes many thousands of queue messages, and another that is only called occasionally but has high memory requirements, you might want to deploy them in separate function apps so they get their own sets of resources and they scale independently of each other.

Organizzare le funzioni per la configurazione e la distribuzioneOrganize functions for configuration and deployment

Le app per le funzioni hanno un host.json file, che viene usato per configurare il comportamento avanzato dei trigger di funzione e il runtime di funzioni di Azure.Function apps have a host.json file, which is used to configure advanced behavior of function triggers and the Azure Functions runtime. Le modifiche apportate al host.json file si applicano a tutte le funzioni all'interno dell'app.Changes to the host.json file apply to all functions within the app. Se sono presenti alcune funzioni che necessitano di configurazioni personalizzate, provare a spostarle nella propria app per le funzioni.If you have some functions that need custom configurations, consider moving them into their own function app.

Tutte le funzioni del progetto locale vengono distribuite insieme come un set di file nell'app per le funzioni in Azure.All functions in your local project are deployed together as a set of files to your function app in Azure. Potrebbe essere necessario distribuire le singole funzioni separatamente o usare funzionalità come gli slot di distribuzione per alcune funzioni e non altre.You might need to deploy individual functions separately or use features like deployment slots for some functions and not others. In questi casi, è necessario distribuire queste funzioni (in progetti di codice separati) a diverse app per le funzioni.In such cases, you should deploy these functions (in separate code projects) to different function apps.

Organizzare le funzioni per privilegioOrganize functions by privilege

Le stringhe di connessione e altre credenziali archiviate nelle impostazioni dell'applicazione conferiscono a tutte le funzioni nell'app per le funzioni lo stesso set di autorizzazioni nella risorsa associata.Connection strings and other credentials stored in application settings gives all of the functions in the function app the same set of permissions in the associated resource. Provare a ridurre al minimo il numero di funzioni con accesso a credenziali specifiche spostando le funzioni che non usano tali credenziali in un'app per le funzioni separata.Consider minimizing the number of functions with access to specific credentials by moving functions that don't use those credentials to a separate function app. È sempre possibile usare tecniche come il concatenamento delle funzioni per spostare i dati tra funzioni in app per le funzioni diverse.You can always use techniques such as function chaining to pass data between functions in different function apps.

Procedure consigliate per la scalabilitàScalability best practices

Esistono diversi fattori che influiscono sulle modalità di ridimensionamento delle istanze dell'app per le funzioni.There are a number of factors that impact how instances of your function app scale. Informazioni dettagliate sono disponibili nella documentazione relativa alla scalabilità delle funzioni.The details are provided in the documentation for function scaling. Di seguito sono descritte alcune procedure consigliate per garantire la scalabilità ottimale di un'app per le funzioni.The following are some best practices to ensure optimal scalability of a function app.

Condividere e gestire le connessioniShare and manage connections

Riutilizzare le connessioni alle risorse esterne, quando possibile.Reuse connections to external resources whenever possible. Vedere come gestire le connessioni in Funzioni di Azure.See how to manage connections in Azure Functions.

Evitare di condividere gli account di archiviazioneAvoid sharing storage accounts

Quando si crea un'app per le funzioni, è necessario associarla a un account di archiviazione.When you create a function app, you must associate it with a storage account. La connessione dell'account di archiviazione viene mantenuta nell'impostazione dell'applicazione AzureWebJobsStorage.The storage account connection is maintained in the AzureWebJobsStorage application setting.

Per incrementare le prestazioni, usare un account di archiviazione diverso per ogni app per le funzioni.To maximize performance, use a separate storage account for each function app. Questo accorgimento è particolarmente importante in presenza di funzioni attivate da Hub eventi o Durable Functions, che generano entrambe un volume elevato di transazioni di archiviazione.This is particularly important when you have Durable Functions or Event Hub triggered functions, which both generate a high volume of storage transactions. Quando la logica dell'applicazione interagisce con Archiviazione di Azure, direttamente (usando Storage SDK) o tramite una delle associazioni di archiviazione, è necessario usare un account di archiviazione dedicato.When your application logic interacts with Azure Storage, either directly (using the Storage SDK) or through one of the storage bindings, you should use a dedicated storage account. Ad esempio, se è presente una funzione attivata da Hub eventi che scrive alcuni dati nell'archivio BLOB, usare due account di archiviazione, uno per l'app per le funzioni e un altro per i BLOB archiviati dalla funzione.For example, if you have an Event Hub-triggered function writing some data to blob storage, use two storage accounts—one for the function app and another for the blobs being stored by the function.

Non combinare codice di test e di produzione nella stessa app per le funzioniDon't mix test and production code in the same function app

Le funzioni all'interno di un'app per le funzioni condividono le risorse.Functions within a function app share resources. Ad esempio, la memoria è condivisa.For example, memory is shared. Se si usa un'app per le funzioni nell'ambiente di produzione, non aggiungere funzioni e risorse relative ai test,If you're using a function app in production, don't add test-related functions and resources to it. per evitare possibili sovraccarichi imprevisti durante l'esecuzione del codice di produzione.It can cause unexpected overhead during production code execution.

Prestare attenzione a quello che si carica nelle app per le funzioni di produzione.Be careful what you load in your production function apps. La memoria viene calcolata in ogni funzione nell'app.Memory is averaged across each function in the app.

Se si dispone di un assembly condiviso a cui si fa riferimento in più funzioni .NET, inserirlo in una cartella condivisa comune.If you have a shared assembly referenced in multiple .NET functions, put it in a common shared folder. In caso contrario, è possibile distribuire accidentalmente più versioni dello stesso file binario che si comportano in modo diverso tra le funzioni.Otherwise, you could accidentally deploy multiple versions of the same binary that behave differently between functions.

Non usare la registrazione dettagliata nel codice di produzione, che ha un impatto negativo sulle prestazioni.Don't use verbose logging in production code, which has a negative performance impact.

Usare codice asincrono ma evitare di bloccare le chiamateUse async code but avoid blocking calls

La programmazione asincrona è una procedura consigliata, soprattutto quando sono interessati le operazioni di I/O di blocco.Asynchronous programming is a recommended best practice, especially when blocking I/O operations are involved.

In C# evitare sempre di fare riferimento alla Result proprietà o al Wait metodo chiamante su un' Task istanza.In C#, always avoid referencing the Result property or calling Wait method on a Task instance. Questo approccio può causare l'esaurimento di un thread.This approach can lead to thread exhaustion.

Suggerimento

Se si prevede di usare binding HTTP o WebHook, evitare l'esaurimento delle porte che può essere causato da un'errata creazione di istanze di HttpClient.If you plan to use the HTTP or WebHook bindings, plan to avoid port exhaustion that can be caused by improper instantiation of HttpClient. Per altre informazioni, vedere How to manage connections in Azure Functions (Come gestire le connessioni in Funzioni di Azure).For more information, see How to manage connections in Azure Functions.

Usare più processi di lavoroUse multiple worker processes

Per impostazione predefinita, qualsiasi istanza host per functions usa un singolo processo di lavoro.By default, any host instance for Functions uses a single worker process. Per migliorare le prestazioni, soprattutto con i runtime a thread singolo come Python, usare il FUNCTIONS_WORKER_PROCESS_COUNT per aumentare il numero di processi di lavoro per host (fino a 10).To improve performance, especially with single-threaded runtimes like Python, use the FUNCTIONS_WORKER_PROCESS_COUNT to increase the number of worker processes per host (up to 10). Funzioni di Azure prova quindi a distribuire uniformemente le chiamate di funzioni simultanee tra questi processi di lavoro.Azure Functions then tries to evenly distribute simultaneous function invocations across these workers.

FUNCTIONS_WORKER_PROCESS_COUNT si applica a ogni host creato da Funzioni quando le istanze dell'applicazione vengono aumentate per soddisfare la domanda.The FUNCTIONS_WORKER_PROCESS_COUNT applies to each host that Functions creates when scaling out your application to meet demand.

Ricevere messaggi in batch, se possibileReceive messages in batch whenever possible

Alcuni trigger come l'hub eventi consentono di ricevere un batch di messaggi in un'unica chiamata.Some triggers like Event Hub enable receiving a batch of messages on a single invocation. L'invio di messaggi in batch offre prestazioni notevolmente migliori.Batching messages has much better performance. È possibile configurare le dimensioni massime del batch nel file host.json come descritto nella documentazione di riferimento su host.jsonYou can configure the max batch size in the host.json file as detailed in the host.json reference documentation

Per le funzioni C#, è possibile modificare il tipo in una matrice fortemente tipizzata.For C# functions, you can change the type to a strongly-typed array. Anziché EventData sensorEvent, la firma del metodo può essere, ad esempio, EventData[] sensorEvent.For example, instead of EventData sensorEvent the method signature could be EventData[] sensorEvent. Per gli altri linguaggi, è necessario impostare in modo esplicito la proprietà Cardinality in in modo function.json many da abilitare l'invio in batch, come illustrato di seguito.For other languages, you'll need to explicitly set the cardinality property in your function.json to many in order to enable batching as shown here.

Configurare i comportamenti degli host per migliorare la gestione della concorrenzaConfigure host behaviors to better handle concurrency

Il file host.json nell'app per le funzioni consente di configurare i comportamenti del trigger e del runtime dell'host.The host.json file in the function app allows for configuration of host runtime and trigger behaviors. Oltre ai comportamenti di invio in batch, è possibile gestire anche la concorrenza in una serie di trigger.In addition to batching behaviors, you can manage concurrency for a number of triggers. La modifica dei valori di queste opzioni consente spesso di applicare a ogni istanza la scalabilità appropriata per soddisfare le esigenze delle funzioni richiamate.Often adjusting the values in these options can help each instance scale appropriately for the demands of the invoked functions.

Le impostazioni nel host.jssu file si applicano a tutte le funzioni all'interno dell'app, all'interno di una singola istanza della funzione.Settings in the host.json file apply across all functions within the app, within a single instance of the function. Se, ad esempio, si dispone di un'app per le funzioni con due funzioni HTTP e maxConcurrentRequests richieste impostate su 25, una richiesta a uno dei trigger http viene conteggiata per le 25 richieste simultanee condivise.For example, if you had a function app with two HTTP functions and maxConcurrentRequests requests set to 25, a request to either HTTP trigger would count towards the shared 25 concurrent requests. Quando l'app per le funzioni viene ridimensionata a 10 istanze, le dieci funzioni consentono di eseguire in modo efficace 250 richieste simultanee (10 istanze * 25 richieste simultanee per istanza).When that function app is scaled to 10 instances, the ten functions effectively allow 250 concurrent requests (10 instances * 25 concurrent requests per instance).

Altre opzioni di configurazione host sono disponibili nell' articolohost.jsdi configurazione.Other host configuration options are found in the host.json configuration article.

Passaggi successiviNext steps

Per altre informazioni, vedere le seguenti risorse:For more information, see the following resources: