Guide pratique pour gérer les connexions dans Azure FunctionsHow to manage connections in Azure Functions

Dans une application de fonction, les fonctions partagent des ressources, parmi lesquelles des connexions — connexions HTTP, connexions de base de données et connexions aux services Azure tels que Stockage.Functions in a function app share resources, and among those shared resources are connections — HTTP connections, database connections, and connections to Azure services such as 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 n’utiliser que le nombre de connexions nécessaire.This article explains how to code your functions to avoid using more connections than they actually need.

Limite de connexionsConnections limit

Le nombre de connexions disponibles est limité en partie car une application de fonction s’exécute dans le bac à sable Azure App Service.The number of available connections is limited partly because a function app runs in the Azure App Service sandbox. L’une des restrictions qu’impose le bac à sable à votre code est le nombre maximal de connexions, soit 300.One of the restrictions that the sandbox imposes on your code is a cap on the number of connections, currently 300. Quand vous atteignez cette limite, le runtime des fonctions crée un journal avec le message suivant : Host thresholds exceeded: Connections.When you reach this limit, the functions runtime creates a log with the following message: Host thresholds exceeded: Connections.

La probabilité de dépasser la limite augmente quand le contrôleur de mise à l’échelle ajoute des instances d’application de fonction pour gérer plus de requêtes.The likelihood of exceeding the limit goes up when the scale controller adds function app instances to handle more requests. Chaque instance d’application de fonction peut exécuter plusieurs fonctions en même temps, chacune utilisant des connexions dans la limite des 300 connexions.Each function app instance can be running many functions at once, all of which are using connections that count toward the 300 limit.

Utiliser des clients statiquesUse static 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. Les clients .NET, comme les clients HttpClient, DocumentClient et Stockage Azure peuvent gérer les connexions si vous utilisez un seul client statique..NET clients like the HttpClient, DocumentClient, and Azure Storage clients can manage connections if you use a single, static client.

Voici quelques recommandations à suivre quand vous utilisez un client spécifique au service dans une application Azure Functions :Here are some guidelines to follow when using a service-specific client in an Azure Functions application:

  • Ne créez pas un client à chaque appel de fonction.DO NOT create a new client with every function invocation.
  • Créez un client statique unique qui peut être utilisé par chaque appel de fonction.DO create a single, static client that can be used by every function invocation.
  • Envisagez de créer un client statique unique dans une classe d’assistance partagée 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 code Function C# créant un HttpClient statique :Here's an example of C# function code that creates a static 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
}

Une question fréquente concernant HttpClient .NET est « Dois-je supprimer mon client ? ».A common question about the .NET HttpClient is "Should I be disposing my client?" En règle générale, vous supprimez les objets qui implémentent IDisposable quand vous avez terminé de les utiliser.In general, you dispose objects that implement IDisposable when you're done using them. Par contre, vous ne supprimez pas un client statique, car vous n’avez pas terminé de l’utiliser quand la fonction prend fin.But you don't dispose 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 d’agent HTTP (Node.js)HTTP agent examples (Node.js)

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. Les paramètres de connexion sont configurés à l’aide d’options sur la classe http.agent.Connection parameters are configured using options on the http.agent class. Pour les options détaillées disponibles avec l’agent HTTP, voir nouvel Agent([options]).See new Agent([options]) for the detailed options available with the HTTP agent.

L’http.globalAgent global utilisé par http.request() dispose de toutes ces valeurs définies par défaut.The global http.globalAgent 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 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
}

Connexions SqlClientSqlClient connections

Le code de votre 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 may 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 frameworks de données qui s’appuient sur ADO.NET, comme 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. Cependant, comme vous êtes toujours susceptible d’avoir un nombre insuffisant de connexions, vous devez optimiser les connexions à la base de données.However, 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

Certains frameworks de données, comme Entity Framework, obtiennent généralement les chaînes de connexion auprès de la section ConnectionStrings 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 SqlConnection dans votre code de fonction, vous devez stocker la valeur de la chaîne de connexion dans les Paramètres d’application avec vos autres connexions.If you are creating a 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 l’intérêt que présentent les clients statiques, consultez Antimodèle d’instanciation incorrect.For more information about why static clients are recommended, 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.