Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
In Funzioni di Azure una singola istanza dell'app per le funzioni consente l'elaborazione simultanea di più eventi. Poiché vengono eseguiti nella stessa istanza di calcolo, condividono risorse di memoria, CPU e connessione. In determinati piani di hosting, una domanda elevata su un'istanza specifica fa sì che l'host di Funzioni crei automaticamente nuove istanze per gestire il carico aumentato. In questi piani di scalabilità dinamica esiste un compromesso tra concorrenza e comportamenti di ridimensionamento. Per fornire maggiore controllo sull'esecuzione dell'app, Funzioni consente di gestire il numero di esecuzioni simultanee.
Funzioni offre due modi principali per gestire la concorrenza:
- Correzione della concorrenza per istanza: è possibile configurare limiti a livello di host per la concorrenza specifici dei singoli trigger. Questo modello è il comportamento di concorrenza predefinito per Funzioni.
- Concorrenza dinamica: per determinati tipi di trigger, l'host delle funzioni può determinare automaticamente il livello di concorrenza migliore per tale trigger nell'applicazione di funzioni. È necessario acconsentire esplicitamente a questo modello di concorrenza.
Questo articolo descrive i comportamenti di concorrenza dei trigger basati su eventi in Funzioni e il modo in cui questi comportamenti influiscono sul ridimensionamento nei piani dinamici. Confronta anche i modelli fissi per istanza e concorrenza dinamica.
Ridimensionamento e concorrenza
Per le funzioni che usano trigger basati su eventi o rispondono alle richieste HTTP, è possibile raggiungere rapidamente i limiti delle esecuzioni simultanee durante periodi di domanda elevata. Durante questi periodi, è necessario essere in grado di ridimensionare l'app per le funzioni aggiungendo istanze per evitare un backlog nell'elaborazione delle richieste in ingresso. Il modo in cui l'app viene ridimensionata dipende dal piano di hosting:
| Tipo di scala | Piani di hosting | Descrizione |
|---|---|---|
| Scalabilità dinamica (guidata dagli eventi) |
Consumo Flex Consumption Premium |
In un piano di scalabilità dinamica, l'host aumenta o riduce il numero di istanze dell'app per le funzioni in base al numero di eventi in ingresso. Per altre informazioni, vedere Scalabilità guidata dagli eventi in Funzioni di Azure. |
| Ridimensionamento manuale | Piani dedicati (servizio app) | Quando si ospita l'app per le funzioni in un piano dedicato, è necessario configurare manualmente le istanze durante periodi di carico superiore o configurare uno schema di scalabilità automatica. |
Prima che si verifichi un ridimensionamento, l'app per le funzioni tenta di gestire gli aumenti di carico gestendo più chiamate dello stesso tipo in una singola istanza. Di conseguenza, queste esecuzioni simultanee su una determinata istanza influiscono direttamente sulle decisioni di scalabilità. Ad esempio, quando un'app in un piano di scalabilità dinamica raggiunge un limite di concorrenza, potrebbe essere necessario ridimensionare per mantenere il passo con la domanda in ingresso.
L'equilibrio tra scalabilità e concorrenza che si tenta di ottenere nell'app dipende da dove possono verificarsi colli di bottiglia: nell'elaborazione (limitazioni del processo a elevato utilizzo di CPU) o in un servizio downstream (limitazioni basate su I/O).
Concorrenza per istanza fissa
Per impostazione predefinita, la maggior parte dei trigger supporta un modello di configurazione della concorrenza fisso per ogni istanza tramite il ridimensionamento basato sulla destinazione. In questo modello ogni tipo di trigger ha un limite di concorrenza per istanza.
È possibile eseguire l'override dei valori predefiniti di concorrenza per la maggior parte dei trigger impostando una concorrenza specifica per istanza per quel tipo di trigger. Per molti trigger, è possibile configurare le impostazioni di concorrenza nel file filehost.json. Ad esempio, il trigger del bus di servizio di Azure fornisce sia un'impostazione MaxConcurrentCalls che un'impostazione MaxConcurrentSessions in host.json. Queste impostazioni interagiscono per controllare il numero massimo di messaggi che ogni app per le funzioni elabora contemporaneamente in ogni istanza.
In alcuni scenari di ridimensionamento basati su obiettivi, ad esempio quando si usa un trigger Apache Kafka o Azure Cosmos DB, la configurazione della concorrenza si trova nella dichiarazione della funzione, non nel file host.json. Altri tipi di trigger includono meccanismi predefiniti per il bilanciamento del carico delle chiamate tra istanze. Ad esempio, Hub eventi di Azure e Azure Cosmos DB usano entrambi uno schema basato su partizione.
Per i tipi di trigger che supportano la configurazione della concorrenza, le impostazioni di concorrenza vengono applicate a tutte le istanze in esecuzione. In questo modo, è possibile controllare la concorrenza massima per le funzioni in ogni istanza. Ad esempio, quando la funzione è a elevato utilizzo di CPU o a elevato utilizzo di risorse, è possibile scegliere di limitare la concorrenza per mantenere integre le istanze. In questo caso, è possibile basarsi sul ridimensionamento per gestire carichi aumentati. Analogamente, quando la funzione effettua richieste a un servizio downstream che viene limitato, è consigliabile considerare anche la limitazione della concorrenza per evitare l'overload del servizio downstream.
Concorrenza dei trigger HTTP
Si applica solo al piano tariffario di consumo Flex
La concorrenza dei trigger HTTP è un tipo speciale di concorrenza fissa per istanza. Nella concorrenza dei trigger HTTP, la concorrenza predefinita dipende anche dalle dimensioni dell'istanza.
Il piano Flex Consumption ridimensiona tutte le funzioni trigger HTTP insieme come gruppo. Per altre informazioni, vedere Ridimensionamento per funzione.
La tabella seguente indica l'impostazione di concorrenza predefinita per i trigger HTTP in una determinata istanza, in base alle dimensioni della memoria dell'istanza configurate:
| Dimensioni dell'istanza (MB) | Concorrenza predefinita* |
|---|---|
| 512 | 4 |
| 2,048 | 16 |
| 4,096 | 32 |
*Nelle app Python tutte le dimensioni dell'istanza usano un livello di concorrenza del trigger HTTP di uno per impostazione predefinita.
Questi valori predefiniti dovrebbero funzionare correttamente per la maggior parte dei casi ed è possibile iniziare con essi. Si consideri che a un determinato numero di richieste HTTP, aumentando il valore di concorrenza HTTP si riduce il numero di istanze necessarie per gestire le richieste HTTP. Analogamente, la riduzione del valore di concorrenza HTTP richiede più istanze per gestire lo stesso carico.
Se è necessario ottimizzare la concorrenza HTTP, è possibile farlo usando l'interfaccia della riga di comando di Azure. Per altre informazioni, vedere Impostare limiti di concorrenza HTTP.
I valori di concorrenza predefiniti nella tabella precedente si applicano solo quando non si imposta la propria impostazione di concorrenza HTTP. Quando non si imposta in modo esplicito un'impostazione di concorrenza HTTP, la concorrenza predefinita aumenta come illustrato nella tabella quando si modificano le dimensioni dell'istanza. Dopo aver impostato in modo specifico un valore di concorrenza HTTP, tale valore viene mantenuto nonostante le modifiche apportate alle dimensioni dell'istanza.
Determinare la concorrenza fissa ottimale per istanza
Le configurazioni fisse di concorrenza per istanza forniscono il controllo su determinati comportamenti dei trigger, come la limitazione delle chiamate delle funzioni. Tuttavia, può essere difficile determinare i valori ottimali per queste impostazioni. In genere, è necessario arrivare a valori accettabili da un processo iterativo di test di carico. Anche dopo aver determinato un set di valori che funzionano per un profilo di carico specifico, il numero di eventi che arrivano dai servizi connessi può cambiare da giorno a giorno. Questa variabilità può causare l'esecuzione dell'app con valori non ottimali. Ad esempio, l'app per le funzioni potrebbe dover elaborare payload di messaggi particolarmente impegnativi nell'ultimo giorno della settimana, con conseguente necessità di limitare la concorrenza. Tuttavia, durante il resto della settimana, i payload del messaggio potrebbero essere più leggeri, il che significa che è possibile usare un livello di concorrenza superiore il resto della settimana.
Idealmente, il sistema dovrebbe consentire alle istanze di elaborare il maggior numero possibile di operazioni mantenendo ogni istanza integra e le latenze basse. La concorrenza dinamica è progettata a tale scopo.
Concorrenza dinamica
Funzioni offre ora un modello di concorrenza dinamico che semplifica la configurazione della concorrenza per tutte le app per le funzioni in esecuzione nello stesso piano.
Note
La concorrenza dinamica è attualmente supportata solo per Azure Blob Storage, Azure Queue Storage e i trigger di Service Bus. Inoltre, è necessario usare le versioni di estensione elencate nel supporto delle estensioni, più avanti in questo articolo.
Vantaggi
La concorrenza dinamica offre i vantaggi seguenti:
- Configurazione semplificata: non è più necessario determinare manualmente le impostazioni di concorrenza per trigger. Il sistema apprende i valori ottimali per il carico di lavoro nel tempo.
- Regolazioni dinamiche: la concorrenza viene modificata in modo dinamico in tempo reale, consentendo al sistema di adattarsi ai modelli di carico modificati nel tempo.
- Protezione dell'integrità dell'istanza: il runtime limita la concorrenza ai livelli che un'istanza dell'app per le funzioni può gestire comodamente. Questi limiti proteggono l'app dal sovraccarico assumendo più lavoro di quanto dovrebbe.
- Velocità effettiva migliorata: la velocità effettiva complessiva è migliorata, perché le singole istanze non estraggono più lavoro di quanto possano elaborare rapidamente. Di conseguenza, il lavoro viene bilanciato in modo più efficace tra istanze. Per le funzioni in grado di gestire carichi più elevati, è possibile ottenere una velocità effettiva maggiore aumentando la concorrenza ai valori superiori alla configurazione predefinita.
Configurazione dinamica della concorrenza
È possibile attivare la concorrenza dinamica a livello di host nel file host.json . Quando è attivata, i livelli di concorrenza di qualsiasi estensione di associazione che supportano questa funzionalità vengono modificati automaticamente in base alle esigenze. In questi casi, le impostazioni di concorrenza dinamiche sostituiscono tutte le impostazioni di concorrenza configurate manualmente.
Per impostazione predefinita, la concorrenza dinamica è disattivata. Quando si attiva la concorrenza dinamica, la concorrenza inizia a un livello di uno per ogni funzione. Il livello di concorrenza viene regolato in base a un valore ottimale, determinato dall'host.
È possibile attivare la concorrenza dinamica nell'app per le funzioni aggiungendo le impostazioni seguenti al file host.json :
{
"version": "2.0",
"concurrency": {
"dynamicConcurrencyEnabled": true,
"snapshotPersistenceEnabled": true
}
}
Quando snapshotPersistenceEnabled è true, ovvero il valore predefinito, i valori di concorrenza appresi vengono resi persistenti periodicamente nell'archiviazione. Le nuove istanze iniziano da questi valori invece di iniziare da un livello di uno e dover ripetere l'apprendimento.
Gestione concorrenza
Dietro le quinte, quando viene attivata la concorrenza dinamica, viene eseguito in background un processo di gestione della concorrenza. Questo gestore monitora costantemente le metriche di integrità delle istanze, ad esempio l'utilizzo della CPU e del thread, e le modifiche vengono limitate in base alle esigenze. Quando una o più limitazioni sono abilitate, la concorrenza delle funzioni viene regolata fino a quando l'host non è di nuovo integro. Quando le limitazioni sono disattivate, la concorrenza può aumentare. Diverse euristiche vengono usate per regolare in modo intelligente la concorrenza verso l'alto o verso il basso in base alle esigenze in base a queste limitazioni. Nel corso del tempo, la concorrenza per ogni funzione si stabilizza a un determinato livello. Poiché può richiedere tempo per determinare il valore di concorrenza ottimale, usare la concorrenza dinamica solo se un valore non ottimale è accettabile per la soluzione inizialmente o dopo un periodo di inattività.
I livelli di concorrenza vengono gestiti per ogni singola funzione. In particolare, il sistema si bilancia tra le funzioni a elevato utilizzo di risorse che richiedono un basso livello di concorrenza e funzioni più leggere che possono gestire una concorrenza più elevata. Il bilanciamento della concorrenza per ogni funzione consente di mantenere l'integrità complessiva dell'istanza dell'app per le funzioni.
Quando la concorrenza dinamica è attivata, è possibile trovare decisioni di concorrenza dinamiche nei log. Ad esempio, i log verranno visualizzati quando sono abilitate varie limitazioni e ogni volta che la concorrenza viene modificata verso l'alto o verso il basso per ogni funzione. Questi log vengono scritti nella categoria di log Host.Concurrency nella tabella delle tracce.
Supporto per estensioni
La concorrenza dinamica è abilitata per un'app per le funzioni a livello di host e per tutte le estensioni che supportano l'esecuzione dinamica della concorrenza in tale modalità. La concorrenza dinamica richiede la collaborazione tra l'host e le singole estensioni del trigger. Solo le versioni elencate delle estensioni seguenti supportano la concorrenza dinamica.
| Estensione | Versione | Descrizione |
|---|---|---|
| Archiviazione code | Versione 5.x (estensione archiviazione) | Il trigger di archiviazione code ha un proprio ciclo di polling dei messaggi. Quando si usa una configurazione fissa per istanza, le opzioni di configurazione BatchSize e NewBatchThreshold regolano la simultaneità. Quando si usa la concorrenza dinamica, tali valori di configurazione vengono ignorati. La concorrenza dinamica è integrata nel ciclo di messaggi, quindi il numero di messaggi recuperati per iterazione viene regolato dinamicamente. Quando le limitazioni sono attivate, l'host diventa sovraccarico. L'elaborazione dei messaggi è sospesa finché gli strozzatori non vengono disattivati. Quando le limitazioni sono disattivate, la concorrenza può aumentare. |
| Archiviazione BLOB | Versione 5.x (estensione archiviazione) | Internamente, il trigger di Archiviazione BLOB di Azure usa la stessa infrastruttura usata dal trigger di archiviazione code. Quando è necessario elaborare blob nuovi o aggiornati, i messaggi vengono scritti in una coda di controllo gestita dalla piattaforma. Tale coda viene elaborata usando la stessa logica usata per il trigger di archiviazione delle code. Quando la concorrenza dinamica è attivata, la concorrenza per l'elaborazione della coda di controllo viene gestita in modo dinamico. |
| Bus di servizio | Versione 5.x | Il trigger del bus di servizio supporta attualmente tre modelli di esecuzione. La concorrenza dinamica influisce su questi modelli di esecuzione nei modi seguenti:MaxConcurrentCalls regola la concorrenza. Quando si usa la concorrenza dinamica, tale valore di configurazione viene ignorato e la concorrenza viene modificata in modo dinamico.MaxConcurrentSessions regola la concorrenza. Quando viene attivata la concorrenza dinamica, il valore MaxConcurrentSessions viene ignorato e il numero di sessioni che ogni istanza elabora viene regolato dinamicamente.MaxMessageCount . Poiché le chiamate batch sono seriali, la concorrenza per la funzione attivata da batch è sempre una e la concorrenza dinamica non si applica. |
Passaggi successivi
Per altre informazioni, vedere le seguenti risorse: