Verbindingen beheren in Azure Functions

Functies in een functie-app delen resources. Tot deze gedeelde resources behoren 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 technieken die hier worden beschreven, kunnen echter nuttig zijn bij het uitvoeren van een abonnement.

Verbindingslimiet

Het aantal beschikbare verbindingen in een verbruiksabonnement is beperkt, deels 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. Dit is momenteel 600 actieve (in totaal 1200) verbindingen per exemplaar. Wanneer u deze limiet bereikt, schrijft de functions-runtime het volgende bericht naar de logboeken: Host thresholds exceeded: Connections. Zie servicelimieten voor Functies 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 bekijken voor uw functie-apps, zoals uitvoeringen. Zie Telemetrie weergeven in Application Insights voor meer informatie.

Statische clients

Om te voorkomen dat u meer verbindingen vasthoudt dan nodig is, gebruikt u clientexemplaren opnieuw in plaats van nieuwe exemplaren te maken bij elke functie-aanroep. We raden u aan clientverbindingen opnieuw te gebruiken voor elke taal waarin u uw functie kunt schrijven. .NET-clients zoals de 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 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 veelgestelde vraag over HttpClient in .NET is 'Moet ik mijn client verwijderen?' Over het algemeen beschikt u over objecten die worden geïmplementeerd IDisposable wanneer u klaar bent met het gebruik ervan. Maar u beschikt niet over een statische client omdat u deze nog niet hebt gebruikt wanneer de functie wordt beëindigd. U wilt dat de statische client actief is gedurende de duur van uw toepassing.

Azure Cosmos DB-clients

CosmosClient maakt verbinding met een Azure Cosmos DB-exemplaar. In de documentatie van Azure Cosmos DB wordt u aangeraden een singleton Azure Cosmos DB-client te gebruiken voor de levensduur van uw toepassing. In het volgende voorbeeld ziet u één patroon om dit 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 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 er nog steeds geen verbindingen meer zijn, moet u de verbindingen met de database optimaliseren. Zie SQL Server Connection Pooling (ADO.NET) voor meer informatie.

Tip

Sommige gegevensframeworks, zoals Entity Framework, halen doorgaans verbindingsreeksen op 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 waarde connection string opslaan in Toepassingsinstellingen met uw andere verbindingen.

Volgende stappen

Zie Antipatroon voor onjuiste instantiatie voor meer informatie over waarom we statische clients aanbevelen.

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