Ottimizzare le prestazioni e l'affidabilità delle funzioni di AzureOptimize the 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.

Procedure consigliate generaliGeneral best practices

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. Le dimensioni di una funzione possono diventare grandi a causa della presenza di molte dipendenze di Node.js.A function can become large due to 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 acknowledgment entro un determinato limite di tempo. È normale per i webhook richiedere una risposta immediata.For example, a webhook or HTTP trigger function might require an acknowledgment response within a certain time limit; it is 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 l'operazione effettiva e di restituire una risposta immediata.This approach allows you to 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 per integrare più funzioni non si usano queste due soluzioni, è opportuno in genere usare le code di archiviazione per la comunicazione tra funzioni.If not using Durable Functions or Logic Apps to integrate with multiple functions, it is generally a best practice to use storage queues for cross function communication. Il motivo principale è che le code di archiviazione sono più economiche ed è molto più facile sottoporle a provisioning.The main reason is storage queues are cheaper and much easier to provision.

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 i 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.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.

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 eventuali informazioni obbligatorie sullo stato.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. Ad esempio, se si deve assolutamente eseguire un'azione una volta al giorno, scriverla in modo che possa essere eseguita a qualsiasi ora del giorno con gli stessi risultati.For example, if you have something that absolutely must run once a day, write it so it can run any time during the day with the same results. La funzione può essere chiusa quando non è presente alcun lavoro da svolgere per un determinato giorno.The function can exit when there is 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. Query per 10.000 righe in un database.Query for 10,000 rows in a db.
  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.

In base alla complessità del sistema, è possibile che i servizi downstream coinvolti non funzionino correttamente, che si verifichino interruzioni della rete, che vengano raggiunti i limiti di quota e così via. Tutti questi elementi 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. Ciò può influire in modo negativo sul flusso di lavoro.This can have a serious impact on your work flow.

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 la scalabilitàScalability best practices

Sulla scalabilità delle istanze dell'app per le funzioni influiscono vari tipi di fattori.There are a number of factors which 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.

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 usa un assembly condiviso a cui si fa riferimento in più funzioni di .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. Fare riferimento all'assembly con un'istruzione simile all'esempio seguente se si usano script C# (con estensione csx):Reference the assembly with a statement similar to the following example if using C# Scripts (.csx):

#r "..\Shared\MyAssembly.dll". 

In caso contrario, è facile distribuire accidentalmente più versioni di prova dello stesso binario che si comportano in modo diverso nelle varie funzioni.Otherwise, it is easy to accidentally deploy multiple test versions of the same binary that behave differently between functions.

Non usare la registrazione dettagliata nel codice di produzione.Don't use verbose logging in production code. Ha un impatto negativo sulle prestazioni.It 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.Asynchronous programming is a recommended best practice. Evitare sempre, tuttavia, di fare riferimento alla proprietà Result o di chiamare il metodo Wait su un'istanza di Task.However, 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 l'articolo Improper Instantiation antipattern (Antipattern non valido per la creazione di istanze).For more information, review the article Improper Instantiation antipattern.

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 functions.json come descritto nella documentazione di riferimento su host.jsonYou can configure the max batch size in the functions.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 altri linguaggi è necessario impostare in modo esplicito la proprietà della cardinalità di function.json in many per consentire 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 del file hosts vengono applicate a tutte le funzioni all'interno dell'app, in una singola istanza della funzione.Settings in the hosts file apply across all functions within the app, within a single instance of the function. Se, ad esempio, si avesse un'app per le funzioni con due funzioni HTTP e le richieste simultanee fossero impostate su 25, anche una richiesta a un trigger HTTP verrebbe conteggiata come una delle 25 richieste simultanee condivise.For example, if you had a function app with 2 HTTP functions and concurrent requests set to 25, a request to either HTTP trigger would count towards the shared 25 concurrent requests. Se l'app per le funzioni venisse ridimensionata a 10 istanze, quindi, le due funzioni consentirebbero di fatto 250 richieste simultanee (10 istanze * 25 richieste simultanee per istanza).If that function app scaled to 10 instances, the 2 functions would effectively allow 250 concurrent requests (10 instances * 25 concurrent requests per instance).

Opzioni dell'host per la concorrenza HTTPHTTP concurrency host options

{
    "http": {
        "routePrefix": "api",
        "maxOutstandingRequests": 20,
        "maxConcurrentRequests": 10,
        "dynamicThrottlesEnabled": false
    }
}
ProprietàProperty DefaultDefault DescrizioneDescription
routePrefixroutePrefix apiapi Il prefisso della route che si applica a tutte le route.The route prefix that applies to all routes. Utilizzare una stringa vuota per rimuovere il prefisso predefinito.Use an empty string to remove the default prefix.
maxOutstandingRequestsmaxOutstandingRequests -1-1 Il numero massimo di richieste in sospeso che verrà mantenuto in un determinato intervallo.The maximum number of outstanding requests that are held at any given time. Questo limite include le richieste che vengono messe in coda ma non hanno avviato l'esecuzione, nonché le esecuzioni in corso.This limit includes requests that are queued but have not started executing, as well as any in progress executions. Le richieste in arrivo che superano questo limite vengono rifiutate con la risposta 429 "Occupato".Any incoming requests over this limit are rejected with a 429 "Too Busy" response. Ciò consente ai chiamanti di usare strategie di ripetizione dei tentativi basate sul tempo e di controllare la latenza massima delle richieste.That allows callers to employ time-based retry strategies, and also helps you to control maximum request latencies. Questa impostazione controlla solo l'accodamento che si verifica all'interno del percorso di esecuzione dell'host dello script.This only controls queuing that occurs within the script host execution path. Altre code, ad esempio la coda di richieste ASP.NET, saranno valide e non interessate da questa impostazione.Other queues such as the ASP.NET request queue will still be in effect and unaffected by this setting. Il valore predefinito è unbounded.The default is unbounded.
maxConcurrentRequestsmaxConcurrentRequests -1-1 Il numero massimo di funzioni HTTP che verrà eseguito in parallelo.The maximum number of http functions that will be executed in parallel. Ciò consente di controllare la concorrenza e pertanto di semplificare la gestione dell'uso delle risorse.This allows you to control concurrency, which can help manage resource utilization. Ad esempio, potrebbe essere presente una funzione HTTP che usa una quantità di risorse di sistema (memoria/CPU/socket) tale da creare problemi quando la concorrenza è troppo elevata.For example, you might have an http function that uses a lot of system resources (memory/cpu/sockets) such that it causes issues when concurrency is too high. Oppure potrebbe essere presente una funzione che invia richieste a un servizio di terze parti e tali chiamate devono essere a frequenza limitata.Or you might have a function that makes outbound requests to a third party service, and those calls need to be rate limited. In questi casi potrebbe risultare utile l'applicazione di una limitazione.In these cases, applying a throttle here can help. Il valore predefinito è unbounded.The default is unbounded.
dynamicThrottlesEnableddynamicThrottlesEnabled falsefalse Quando è abilitata, questa impostazione determina la pipeline di elaborazione della richiesta per il controllo periodico delle prestazioni dei contatori del sistema, ad esempio connessioni/thread/processi/memoria/CPU e così via. Se uno di questi contatori supera una soglia massima predefinita (80%), le richieste verranno rifiutate con una risposta 429 "Occupato" fino a quando i contatori non tornano a livelli normali.When enabled, this setting causes the request processing pipeline to periodically check system performance counters like connections/threads/processes/memory/cpu/etc. and if any of those counters are over a built-in high threshold (80%), requests will be rejected with a 429 "Too Busy" response until the counter(s) return to normal levels.

Altre opzioni di configurazione dell'host sono disponibili nel documento di configurazione dell'host.Other host configuration options can be found in the host configuration document.

Passaggi successiviNext steps

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

Poiché Funzioni di Azure usa Servizio app di Azure, è consigliabile vedere anche le linee guida del servizio app.Because Azure Functions uses Azure App Service, you should also be aware of App Service guidelines.