Share via


Verbindingen beheren in Azure Functions

Functies in een functie-app delen resources. Onder deze gedeelde resources bevinden zich 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 er meer verbindingen worden gebruikt dan nodig is.

Notitie

Verbindingslimieten die in dit artikel worden beschreven, zijn alleen van toepassing wanneer ze worden uitgevoerd in een verbruiksabonnement. De technieken die hier worden beschreven, 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 voor uw code oplegt, is een limiet voor het aantal uitgaande verbindingen, dat momenteel 600 actieve (totaal 1200) 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 Application Insights kunt u metrische gegevens voor uw functie-apps bekijken, zoals uitvoeringen. Zie Telemetrie weergeven in Application Insights voor meer informatie.

Statische clients

Als u meer verbindingen wilt bewaren dan nodig is, moet u clientexemplaren opnieuw gebruiken 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 een enkele 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 ziet u de aanbevolen procedures voor het maken en gebruiken van clients op basis van 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 kunt een statische client niet verwijderen omdat u deze niet meer 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 een Singleton Azure Cosmos DB-client te gebruiken voor de levensduur van uw toepassing. In het volgende voorbeeld ziet u één patroon voor dit in een functie:

#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 relationele SQL-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 verbindingen met de database optimaliseren. Zie SQL Server Connection Pooling (ADO.NET) voor meer informatie.

Tip

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

Volgende stappen

Zie Antipatroon voor onjuiste instantiëring voor meer informatie over waarom we statische clients aanbevelen.

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