Gérer les connexions dans Azure Functions

Functions dans une application de fonction partage des ressources. Parmi ces ressources partagées se trouvent les connexions : connexions HTTP, connexions de base de données et connexions aux services tels que Stockage Azure. L’exécution simultanée de nombreuses fonctions dans un plan de consommation peut engendrer une pénurie de connexions disponibles. Cet article explique comment coder vos fonctions pour n’utiliser que le nombre de connexions nécessaire.

Notes

Les limites de connexion décrites dans cet article s’appliquent uniquement lors de l’exécution dans un Plan de consommation. Toutefois, les techniques décrites ici peuvent présenter un intérêt lors de l’exécution sur n’importe quel plan.

Limite de connexions

Le nombre de connexions disponibles dans un plan de consommation est limité en partie, car une application de fonction dans ce plan s’exécute dans un environnement de bac à sable. L’une des restrictions imposées par le bac à sable sur votre code est une limite du nombre de connexions sortantes, qui s’élève actuellement à 600 connexions actives (1 200 au total) par instance. Quand vous atteignez cette limite, le runtime des fonctions écrit le message suivant dans les journaux : Host thresholds exceeded: Connections. Pour plus d’informations, voir Functions service limits (Limites de service Functions).

Cette limite s’effectue par instance. Quand le contrôleur de mise à l’échelle ajoute des instances d’application de fonction pour gérer plus de requêtes, chaque instance dispose d’une limite de connexion indépendante. Cela signifie qu’il n’existe aucune limite globale de connexion et que vous pouvez avoir beaucoup plus de 600 connexions actives sur toutes les instances actives.

Lors du dépannage, assurez-vous que vous avez activé Application Insights pour votre application de fonction. Application Insights vous permet d’afficher les métriques pour vos applications de fonction comme les exécutions. Pour plus d’informations, consultez l’article Afficher les données de télémétrie dans Application Insights.

Clients statiques

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. Nous vous recommandons de réutiliser les connexions clientes pour tous les langages dans lesquels vous êtes susceptible d’écrire votre fonction. Par exemple, les clients .NET, comme les clients HttpClient, DocumentClient et Stockage Azure, peuvent gérer les connexions si vous utilisez un seul client statique.

Voici quelques recommandations à suivre quand vous utilisez un client spécifique au service dans une application Azure Functions :

  • Ne créez pas un client à chaque appel de fonction.
  • Créez un client statique unique qui peut être utilisé par chaque appel de fonction.
  • Envisagez de créer un client statique unique dans une classe d’assistance partagée si différentes fonctions utilisent le même service.

Exemples de code client

Cette section présente les meilleures pratiques en matière de création et d’utilisation de clients à partir de votre code Function.

Des requêtes HTTP

Voici un exemple de code Function C# créant une instance HttpClient statique :

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

Voici une question fréquente sur HttpClient dans .NET : « Dois-je supprimer mon client ? » En général, vous supprimez les objets qui implémentent IDisposable lorsque vous avez fini de les utiliser. En revanche, vous ne supprimez pas un client statique, car vous n’avez pas terminé de l’utiliser quand la fonction prend fin. Vous souhaitez que le client statique existe pendant la durée de votre application.

Clients Azure Cosmos DB

CosmosClient se connecte à une instance Azure Cosmos DB. La documentation d’Azure Cosmos DB recommande d’utiliser un client Azure Cosmos DB singleton pendant la durée de vie de votre application. L’exemple suivant montre un modèle pour effectuer cette opération dans une fonction :

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

Créez également un fichier nommé « function. proj » pour votre déclencheur et ajoutez le contenu ci-dessous :


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

Connexions SqlClient

Le code de votre fonction peut utiliser le fournisseur de données .NET Framework pour SQL Server (SqlClient) afin d’établir des connexions à une base de données relationnelle SQL. Il s’agit également du fournisseur sous-jacent pour les infrastructures de données qui s’appuient sur ADO.NET, comme Entity Framework. Contrairement aux connexions HttpClient et DocumentClient, ADO.NET implémente par défaut le regroupement de connexions. Cependant, comme vous êtes toujours susceptible d’avoir un nombre insuffisant de connexions, vous devez optimiser les connexions à la base de données. Pour plus d’informations, consultez Regroupement de connexions SQL Server (ADO.NET).

Conseil

Certaines infrastructures 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. 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. Si vous créez une instance de 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.

Étapes suivantes

Pour plus d’informations sur l’intérêt que présentent les clients statiques, consultez Antimodèle d’instanciation incorrect.

Pour obtenir des conseils permettant d’améliorer les performances d’Azure Functions, consultez Optimisation des performances et de la fiabilité d’Azure Functions.