Condividi tramite


Gestire le connessioni in Funzioni di Azure

Le funzioni in un'app per le funzioni condividono le risorse. Tra queste risorse condivise sono presenti connessioni: connessioni HTTP, connessioni di database e connessioni a servizi come Archiviazione di Azure. Quando molte funzioni vengono eseguite simultaneamente in un piano a consumo, è possibile esaurire le connessioni disponibili. Questo articolo illustra come codificare le funzioni per evitare di usare più connessioni di quelle necessarie.

Nota

I limiti di connessione descritti in questo articolo si applicano solo quando vengono eseguiti in un piano a consumo. Tuttavia, le tecniche descritte qui possono essere utili quando vengono eseguite su qualsiasi piano.

Limite di connessione

Il numero di connessioni disponibili in un piano a consumo è limitato in parte perché un'app per le funzioni in questo piano viene eseguita in un ambiente sandbox. Una delle restrizioni che la sandbox impone al codice è un limite al numero di connessioni in uscita, attualmente 600 connessioni attive (1.200 totali) per ogni istanza. Quando si raggiunge questo limite, il runtime di funzioni scrive il messaggio seguente nei log: Host thresholds exceeded: Connections. Per altre informazioni, vedere Limiti del servizio Funzioni.

Questo limite è per istanza. Quando il controller di scalabilità aggiunge istanze dell'app per le funzioni per gestire più richieste, ogni istanza ha un limite di connessione indipendente. Ciò significa che non esiste alcun limite di connessione globale ed è possibile avere più di 600 connessioni attive in tutte le istanze attive.

Durante la risoluzione dei problemi, assicurarsi di aver abilitato Application Insights per l'app per le funzioni. Application Insights consente di visualizzare le metriche per le app per le funzioni, ad esempio le esecuzioni. Per altre informazioni, vedere Visualizzare i dati di telemetria in Application Insights.

Client statici

Per evitare di mantenere più connessioni del necessario, riutilizzare le istanze di client, anziché crearne di nuove con ogni chiamata di funzione. È consigliabile riutilizzare le connessioni client per qualsiasi linguaggio in cui è possibile scrivere la funzione. Ad esempio, i client .NET come i client HttpClient, DocumentClient e Archiviazione di Azure possono gestire le connessioni se si usa un singolo client statico.

Ecco alcune linee guida da seguire quando si usa un client specifico del servizio in un'applicazione Funzioni di Azure:

  • Non creare un nuovo client con ogni chiamata di funzione.
  • Creare un singolo client statico che ogni chiamata di funzione può usare.
  • Valutare la possibilità di creare un singolo client statico in una classe helper condivisa se funzioni diverse usano lo stesso servizio.

Esempi di codice client

Questa sezione illustra le procedure consigliate per la creazione e l'utilizzo di client dal codice funzione.

Richieste HTTP

Ecco un esempio di codice di funzione C# che crea un'istanza statica httpClient :

// Create a single, static HttpClient
private static HttpClient httpClient = new HttpClient();

public static async Task Run(string input)
{
    var response = await httpClient.GetAsync("https://example.com");
    // Rest of function
}

Una domanda comune su HttpClient in .NET è "È consigliabile eliminare il client?" In generale, si eliminano gli oggetti che implementano IDisposable al termine dell'uso. Tuttavia, non si elimina un client statico perché non viene usato al termine della funzione. La durata del client statico deve coincidere con quella dell'applicazione.

Client di Azure Cosmos DB

CosmosClient si connette a un'istanza di Azure Cosmos DB. La documentazione di Azure Cosmos DB consiglia di usare un client di Azure Cosmos DB singleton per l'intera durata dell'applicazione. L'esempio seguente illustra un modello per eseguire questa operazione in una funzione:

#r "Microsoft.Azure.Cosmos"
using Microsoft.Azure.Cosmos;

private static Lazy<CosmosClient> lazyClient = new Lazy<CosmosClient>(InitializeCosmosClient);
private static CosmosClient cosmosClient => lazyClient.Value;

private static CosmosClient InitializeCosmosClient()
{
    // Perform any initialization here
    var uri = "https://youraccount.documents.azure.com:443";
    var authKey = "authKey";
   
    return new CosmosClient(uri, authKey);
}

public static async Task Run(string input)
{
    Container container = cosmosClient.GetContainer("database", "collection");
    MyItem item = new MyItem{ id = "myId", partitionKey = "myPartitionKey", data = "example" };
    await container.UpsertItemAsync(document);
   
    // Rest of function
}

Creare anche un file denominato "function.proj" per il trigger e aggiungere il contenuto seguente:


<Project Sdk="Microsoft.NET.Sdk">
    <PropertyGroup>
        <TargetFramework>netcoreapp3.1</TargetFramework>
    </PropertyGroup>
    <ItemGroup>
        <PackageReference Include="Microsoft.Azure.Cosmos" Version="3.23.0" />
    </ItemGroup>
</Project>

Connessioni SqlClient

Il codice della funzione può usare il provider di dati .NET Framework per SQL Server (SqlClient) per stabilire connessioni a un database relazionale SQL. Si tratta anche del provider sottostante per i framework di dati che si basano su ADO.NET, ad esempio Entity Framework. A differenza delle connessioni HttpClient e DocumentClient, ADO.NET implementa pool di connessioni per impostazione predefinita. Tuttavia, poiché è ancora possibile esaurire le connessioni, è consigliabile ottimizzare le connessioni al database. Per altre informazioni, vedere Pool di connessioni SQL Server (ADO.NET).

Suggerimento

Alcuni framework di dati, ad esempio Entity Framework, in genere ottengono stringhe di connessione dalla sezione ConnectionStrings di un file di configurazione. In questo caso, è necessario aggiungere esplicitamente le stringhe di connessione di database SQL alla raccolta delle stringhe di connessione delle impostazioni dell'app per le funzioni e al file local.settings.json nel progetto locale. Se si crea un'istanza di SqlConnection nel codice della funzione, è necessario archiviare il valore della stringa di connessione nelle impostazioni dell'applicazione con le altre connessioni.

Passaggi successivi

Per altre informazioni sui motivi per cui è consigliabile usare client statici, vedere Antipattern di creazione di istanze non corretto.

Per altri suggerimenti per incrementare le prestazioni di Funzioni di Azure, vedere Ottimizzare le prestazioni e l'affidabilità delle funzioni di Azure.