Verbindingen beheren in Azure Functions

Functies in een functie-app delen resources. Een van deze gedeelde resources zijn verbindingen: HTTP-verbindingen, databaseverbindingen en verbindingen met services zoals Azure Storage. Wanneer veel functies gelijktijdig worden uitgevoerd in een verbruiksabonnement, is het mogelijk om geen beschikbare verbindingen meer te hebben. In dit artikel wordt uitgelegd hoe u uw functies codeert om te voorkomen dat u meer verbindingen gebruikt dan nodig is.

Notitie

Verbindingslimieten die in dit artikel worden beschreven, zijn alleen van toepassing wanneer ze worden uitgevoerd in een verbruiksabonnement. De hier beschreven technieken kunnen echter nuttig zijn bij het uitvoeren van een plan.

Verbindingslimiet

Het aantal beschikbare verbindingen in een verbruiksabonnement is deels beperkt omdat een functie-app in dit plan wordt uitgevoerd in een sandbox-omgeving. Een van de beperkingen die de sandbox aan uw code oplegt, is een limiet voor het aantal uitgaande verbindingen, dat momenteel 600 actieve (1200 totaal) verbindingen per exemplaar is. Wanneer u deze limiet bereikt, schrijft de functions-runtime het volgende bericht naar de logboeken: Host thresholds exceeded: Connections Zie de servicelimieten van Functions voor meer informatie.

Deze limiet is per exemplaar. Wanneer de schaalcontroller functie-app-exemplaren toevoegt om meer aanvragen te verwerken, heeft elk exemplaar een onafhankelijke verbindingslimiet. Dit betekent dat er geen globale verbindingslimiet is en dat u veel meer dan 600 actieve verbindingen kunt hebben voor alle actieve exemplaren.

Zorg er bij het oplossen van problemen voor dat u Application Insights hebt ingeschakeld voor uw functie-app. Met toepassings-Insights kunt u metrische gegevens weergeven voor uw functie-apps, zoals uitvoeringen. Zie Telemetrie weergeven in Application Insights voor meer informatie.

Statische clients

Als u meer verbindingen wilt voorkomen dan nodig is, gebruikt u clientexemplaren opnieuw in plaats van nieuwe exemplaren te maken met elke functieaanroep. We raden u aan clientverbindingen opnieuw te gebruiken voor elke taal waarin u uw functie kunt schrijven. .NET-clients zoals httpclient, documentclient en Azure Storage clients kunnen bijvoorbeeld verbindingen beheren als u één statische client gebruikt.

Hier volgen enkele richtlijnen die u moet volgen wanneer u een servicespecifieke client gebruikt in een Azure Functions toepassing:

  • Maak geen nieuwe client met elke functie-aanroep.
  • Maak één statische client die elke functie-aanroep kan gebruiken.
  • Overweeg om één statische client te maken in een gedeelde helperklasse als verschillende functies dezelfde service gebruiken.

Voorbeelden van clientcode

In deze sectie worden aanbevolen procedures beschreven voor het maken en gebruiken van clients uit uw functiecode.

HTTP-aanvragen

Hier volgt een voorbeeld van C#-functiecode waarmee een statisch HttpClient-exemplaar wordt gemaakt:

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

Een veelvoorkomende vraag over HttpClient in .NET is 'Moet ik mijn client verwijderen?' Over het algemeen kunt u objecten verwijderen die worden geïmplementeerd IDisposable wanneer u klaar bent met het gebruik ervan. Maar u hebt geen statische client verwijderd omdat u deze niet hebt gebruikt wanneer de functie eindigt. U wilt dat de statische client actief is voor de duur van uw toepassing.

Azure Cosmos DB-clients

CosmosClient maakt verbinding met een Azure Cosmos DB-exemplaar. De Documentatie van Azure Cosmos DB raadt u aan om een Singleton Azure Cosmos DB-client te gebruiken voor de levensduur van uw toepassing. In het volgende voorbeeld ziet u één patroon om dat in een functie te doen:

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

Maak ook een bestand met de naam function.proj voor uw trigger en voeg de onderstaande inhoud toe:


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

SqlClient-verbindingen

Uw functiecode kan de .NET Framework-gegevensprovider voor SQL Server (SqlClient) gebruiken om verbindingen te maken met een SQL relationele database. Dit is ook de onderliggende provider voor gegevensframeworks die afhankelijk zijn van ADO.NET, zoals Entity Framework. In tegenstelling tot HttpClient- en DocumentClient-verbindingen implementeert ADO.NET standaard groepsgewijze verbindingen. Maar omdat u nog steeds geen verbindingen meer hebt, moet u de verbindingen met de database optimaliseren. Zie SQL Server Connection Pooling (ADO.NET) voor meer informatie.

Tip

Sommige gegevensframeworks, zoals Entity Framework, krijgen meestal verbindingsreeksen uit de sectie ConnectionStrings van een configuratiebestand. In dit geval moet u expliciet SQL databaseverbindingsreeksen toevoegen aan de verzameling verbindingsreeksen van uw functie-app-instellingen en in het bestand local.settings.json in uw lokale project. Als u een exemplaar van SqlConnection maakt in uw functiecode, moet u de connection string waarde opslaan in toepassingsinstellingen met uw andere verbindingen.

Volgende stappen

Voor meer informatie over waarom we statische clients aanbevelen, zie Onjuiste instantiatie antipatroon.

Zie De prestaties en betrouwbaarheid van Azure Functions optimaliseren voor meer Azure Functions prestatietips.