Gérer les connexions dans Azure FunctionsManage connections in Azure Functions

Fonctions dans une application de fonction partagent des ressources.Functions in a function app share resources. Parmi ces ressources partagées sont connexions : Les connexions HTTP, les connexions de base de données et les connexions aux services tels que le stockage Azure.Among those shared resources are connections: HTTP connections, database connections, and connections to services such as Azure Storage. L’exécution de nombreuses fonctions simultanément peut engendrer une pénurie de connexions disponibles.When many functions are running concurrently, it's possible to run out of available connections. Cet article explique comment coder vos fonctions pour éviter d’utiliser davantage de connexions qu’ils ont besoin.This article explains how to code your functions to avoid using more connections than they need.

Limite de connexionConnection limit

Le nombre de connexions disponibles est limité en partie parce qu’une application de fonction s’exécute dans un environnement de bac à sable.The number of available connections is limited partly because a function app runs in a sandbox environment. Une des restrictions qui le bac à sable impose sur votre code est une limite sur le nombre de connexions sortantes, qui est actuellement 600 connexions (total de 1 200) actives par instance.One of the restrictions that the sandbox imposes on your code is a limit on the number of outbound connections, which is currently 600 active (1,200 total) connections per instance. Lorsque vous atteignez cette limite, le runtime functions écrit le message suivant dans les journaux : Host thresholds exceeded: Connections.When you reach this limit, the functions runtime writes the following message to the logs: Host thresholds exceeded: Connections. Pour plus d’informations, consultez le limites de service de fonctions.For more information, see the Functions service limits.

Cette limite s’effectue par instance.This limit is per instance. Lorsque le contrôleur de mise à l’échelle ajoute des instances d’application de fonction pour traiter les demandes de plus, chaque instance a une limite de connexion indépendante.When the scale controller adds function app instances to handle more requests, each instance has an independent connection limit. Cela signifie qu’il n’existe aucune limite de connexion global, et vous pouvez avoir beaucoup plus de 600 connexions actives entre toutes les instances actives.That means there's no global connection limit, and you can have much more than 600 active connections across all active instances.

Lors du dépannage, assurez-vous que vous avez activé Application Insights pour votre function app.When troubleshooting, make sure that you have enabled Application Insights for your function app. Application Insights vous permet d’afficher les métriques pour vos applications de fonction comme des exécutions.Application Insights lets you view metrics for your function apps like executions. Pour plus d’informations, consultez afficher les données de télémétrie dans Application Insights.For more information, see View telemetry in Application Insights.

Clients statiquesStatic clients

Pour éviter d’avoir plus de connexions que nécessaire, réutilisez les instances clientes au lieu d’en créer à chaque appel de fonction.To avoid holding more connections than necessary, reuse client instances rather than creating new ones with each function invocation. Nous vous recommandons de réutiliser des connexions de client pour n’importe quel langage que vous pouvez écrire votre fonction dans.We recommend reusing client connections for any language that you might write your function in. Par exemple, les clients .NET comme le HttpClient, DocumentClient, et les clients de stockage Azure peuvent gérer les connexions si vous utilisez un client unique et statique.For example, .NET clients like the HttpClient, DocumentClient, and Azure Storage clients can manage connections if you use a single, static client.

Voici quelques conseils à suivre lorsque vous utilisez un client de service spécifique dans une application Azure Functions :Here are some guidelines to follow when you're using a service-specific client in an Azure Functions application:

  • Ne le faites pas créer un nouveau client à chaque invocation de fonction.Do not create a new client with every function invocation.
  • Faire créer un client unique et statique, qui permet de chaque appel de fonction.Do create a single, static client that every function invocation can use.
  • Envisagez création d’un client unique et statique dans une classe d’assistance partagé si différentes fonctions utilisent le même service.Consider creating a single, static client in a shared helper class if different functions use the same service.

Exemples de code clientClient code examples

Cette section présente les meilleures pratiques en matière de création et d’utilisation de clients à partir de votre code Function.This section demonstrates best practices for creating and using clients from your function code.

Exemple HttpClient (C#)HttpClient example (C#)

Voici un exemple de C# fonction le code qui crée un statique HttpClient instance :Here's an example of C# function code that creates a static HttpClient instance:

// 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
}

Une question courante concernant HttpClient dans .NET est « Dois-je supprimer mon client ? »A common question about HttpClient in .NET is "Should I dispose of my client?" En règle générale, vous supprimez des objets qui implémentent IDisposable lorsque vous avez terminé leur utilisation.In general, you dispose of objects that implement IDisposable when you're done using them. Mais vous ne dispose d’un client statique, car vous n’êtes pas terminé l’utiliser pour la fonction se termine.But you don't dispose of a static client because you aren't done using it when the function ends. Vous souhaitez que le client statique existe pendant la durée de votre application.You want the static client to live for the duration of your application.

Exemples de l’agent HTTP (JavaScript)HTTP agent examples (JavaScript)

Parce qu’elle fournit des meilleures options de gestion des connexions, vous devez utiliser la classe http.agent native au lieu de méthodes non natives, telles que le module node-fetch.Because it provides better connection management options, you should use the native http.agent class instead of non-native methods, such as the node-fetch module. Paramètres de connexion sont configurés via les options sur la http.agent classe.Connection parameters are configured through options on the http.agent class. Pour les options détaillées disponibles avec l’agent HTTP, consultez nouvel Agent ([options]).For detailed options available with the HTTP agent, see new Agent([options]).

Global http.globalAgent classe utilisée par http.request() dispose de toutes ces valeurs définies à leurs valeurs par défaut respectifs.The global http.globalAgent class used by http.request() has all of these values set to their respective defaults. La méthode recommandée pour configurer des limites de connexion dans Functions consiste à définir un nombre maximal à l’échelle globale.The recommended way to configure connection limits in Functions is to set a maximum number globally. L’exemple suivant définit le nombre maximal de sockets pour l’application de fonction :The following example sets the maximum number of sockets for the function app:

http.globalAgent.maxSockets = 200;

L’exemple suivant crée une nouvelle requête HTTP avec un agent HTTP personnalisé uniquement pour cette requête :The following example creates a new HTTP request with a custom HTTP agent only for that request:

var http = require('http');
var httpAgent = new http.Agent();
httpAgent.maxSockets = 200;
options.agent = httpAgent;
http.request(options, onResponseCallback);

Exemple de code DocumentClient (C#)DocumentClient code example (C#)

DocumentClient se connecte à une instance d’Azure Cosmos DB.DocumentClient connects to an Azure Cosmos DB instance. La documentation d’Azure Cosmos DB recommande d’utiliser un client Azure Cosmos DB singleton pendant la durée de vie de votre application.The Azure Cosmos DB documentation recommends that you use a singleton Azure Cosmos DB client for the lifetime of your application. L’exemple suivant montre un modèle pour effectuer cette opération dans une fonction :The following example shows one pattern for doing that in a function:

#r "Microsoft.Azure.Documents.Client"
using Microsoft.Azure.Documents.Client;

private static Lazy<DocumentClient> lazyClient = new Lazy<DocumentClient>(InitializeDocumentClient);
private static DocumentClient documentClient => lazyClient.Value;

private static DocumentClient InitializeDocumentClient()
{
    // Perform any initialization here
    var uri = new Uri("example");
    var authKey = "authKey";
    
    return new DocumentClient(uri, authKey);
}

public static async Task Run(string input)
{
    Uri collectionUri = UriFactory.CreateDocumentCollectionUri("database", "collection");
    object document = new { Data = "example" };
    await documentClient.UpsertDocumentAsync(collectionUri, document);
    
    // Rest of function
}

Exemple de code CosmosClient (JavaScript)CosmosClient code example (JavaScript)

CosmosClient se connecte à une instance d’Azure Cosmos DB.CosmosClient connects to an Azure Cosmos DB instance. La documentation d’Azure Cosmos DB recommande d’utiliser un client Azure Cosmos DB singleton pendant la durée de vie de votre application.The Azure Cosmos DB documentation recommends that you use a singleton Azure Cosmos DB client for the lifetime of your application. L’exemple suivant montre un modèle pour effectuer cette opération dans une fonction :The following example shows one pattern for doing that in a function:

const cosmos = require('@azure/cosmos');
const endpoint = process.env.COSMOS_API_URL;
const masterKey = process.env.COSMOS_API_KEY;
const { CosmosClient } = cosmos;

const client = new CosmosClient({ endpoint, auth: { masterKey } });
// All function invocations also reference the same database and container.
const container = client.database("MyDatabaseName").container("MyContainerName");

module.exports = async function (context) {
    const { result: itemArray } = await container.items.readAll().toArray();
    context.log(itemArray);
}

Connexions SqlClientSqlClient connections

Votre code de fonction peut utiliser le fournisseur de données .NET Framework pour SQL Server (SqlClient) pour établir des connexions à une base de données relationnelle SQL.Your function code can use the .NET Framework Data Provider for SQL Server (SqlClient) to make connections to a SQL relational database. Il s’agit également du fournisseur sous-jacent pour les infrastructures de données qui s’appuient sur ADO.NET, tels que Entity Framework.This is also the underlying provider for data frameworks that rely on ADO.NET, such as Entity Framework. Contrairement aux connexions HttpClient et DocumentClient, ADO.NET implémente par défaut le regroupement de connexions.Unlike HttpClient and DocumentClient connections, ADO.NET implements connection pooling by default. Mais étant donné que vous pouvez toujours suffisamment de connexions, vous devez optimiser les connexions à la base de données.But because you can still run out of connections, you should optimize connections to the database. Pour plus d’informations, consultez Regroupement de connexions SQL Server (ADO.NET).For more information, see SQL Server Connection Pooling (ADO.NET).

Conseil

Certaines infrastructures de données, telles que de Entity Framework, obtiennent généralement des chaînes de connexion à partir de la ConnectionStrings section d’un fichier de configuration.Some data frameworks, such as Entity Framework, typically get connection strings from the ConnectionStrings section of a configuration file. Dans ce cas, vous devez ajouter explicitement les chaînes de connexion de base de données SQL à la collection Chaînes de connexion de vos paramètres d’application de fonction et dans le fichier local.settings.json de votre projet local.In this case, you must explicitly add SQL database connection strings to the Connection strings collection of your function app settings and in the local.settings.json file in your local project. Si vous créez une instance de SqlConnection dans votre code de fonction, vous devez stocker la valeur de chaîne de connexion dans paramètres d’Application avec les autres connexions.If you're creating an instance of SqlConnection in your function code, you should store the connection string value in Application settings with your other connections.

Étapes suivantesNext steps

Pour plus d’informations sur la raison pour laquelle nous vous recommandons de clients statiques, consultez antimodèle d’instanciation incorrecte.For more information about why we recommend static clients, see Improper instantiation antipattern.

Pour obtenir des conseils permettant d’améliorer les performances d’Azure Functions, consultez Optimisation des performances et de la fiabilité d’Azure Functions.For more Azure Functions performance tips, see Optimize the performance and reliability of Azure Functions.