Verwalten von Verbindungen in Azure FunctionsManage connections in Azure Functions

Funktionen innerhalb einer Funktions-App nutzen Ressourcen gemeinsam.Functions in a function app share resources. Unter diesen geteilten Ressourcen bestehen Verbindungen: HTTP-Verbindungen, Datenbankverbindungen und Verbindungen mit Diensten, wie etwa Azure Storage.Among those shared resources are connections: HTTP connections, database connections, and connections to services such as Azure Storage. Wenn viele Funktionen gleichzeitig ausgeführt werden, kann es sein, dass nicht mehr genügend Verbindungen zur Verfügung stehen.When many functions are running concurrently, it's possible to run out of available connections. In diesem Artikel erfahren Sie, wie Sie Ihre Funktionen codieren, um zu vermeiden, dass Sie mehr Verbindungen als erforderlich verwenden.This article explains how to code your functions to avoid using more connections than they need.

VerbindungsgrenzwertConnection limit

Die Anzahl der verfügbaren Verbindungen ist teilweise begrenzt, da eine Funktions-App in einer Sandboxumgebung ausgeführt wird.The number of available connections is limited partly because a function app runs in a sandbox environment. Eine Einschränkung, die die Sandbox Ihrem Code auferlegt, ist eine Grenze für die Anzahl der ausgehenden Verbindungen, die derzeit 600 aktive (insgesamt 1.200) Verbindungen pro Instanz beträgt.One of the restrictions that the sandbox imposes on your code is a limit on the number of outbound connections, which is currently 600 active (1,200 total) connections per instance. Wenn diese Grenze erreicht ist, schreibt die Functions-Runtime die folgende Meldung in die Protokolle: Host thresholds exceeded: Connections.When you reach this limit, the functions runtime writes the following message to the logs: Host thresholds exceeded: Connections. Weitere Informationen finden Sie unter Funktions-Apps: Diensteinschränkungen.For more information, see the Functions service limits.

Dieser Grenzwert gilt pro Instanz.This limit is per instance. Wenn der Skalierungscontroller Funktions-App-Instanzen hinzufügt, um mehr Anforderungen zu verarbeiten, weist jede Instanz einen unabhängigen Verbindungsgrenzwert auf.When the scale controller adds function app instances to handle more requests, each instance has an independent connection limit. Das heißt, es gibt keinen globalen Verbindungsgrenzwert, um sie können über alle aktiven Instanzen weit mehr als 600 aktive Verbindungen verwenden.That means there's no global connection limit, and you can have much more than 600 active connections across all active instances.

Stellen Sie bei der Problembehandlung sicher, dass Sie Application Insights für Ihre Funktions-App aktiviert haben.When troubleshooting, make sure that you have enabled Application Insights for your function app. Mit Application Insights können Sie Metriken für Ihre Funktions-Apps wie Ausführungen anzeigen.Application Insights lets you view metrics for your function apps like executions. Weitere Informationen finden Sie unter Anzeigen von Telemetriedaten in Application Insights.For more information, see View telemetry in Application Insights.

Statische ClientsStatic clients

Um zu vermeiden, dass mehr Verbindungen als nötig gehalten werden, erstellen Sie bei jedem Funktionsaufruf keine neuen Instanzen, sondern verwenden die Clientinstanzen erneut.To avoid holding more connections than necessary, reuse client instances rather than creating new ones with each function invocation. Wir empfehlen, Clientverbindungen für jede Sprache, in der Sie Ihre Funktion erstellen, wiederzuverwenden.We recommend reusing client connections for any language that you might write your function in. Beispielsweise können .NET-Clients wie HttpClient und DocumentClient sowie Azure Storage-Clients Verbindungen verwalten, wenn Sie einen einzelnen, statischen Client verwenden.For example, .NET clients like the HttpClient, DocumentClient, and Azure Storage clients can manage connections if you use a single, static client.

Es folgen einige Richtlinien, die zu beachten sind, wenn Sie einen dienstspezifischen Client in einer Azure Functions-Anwendung verwenden:Here are some guidelines to follow when you're using a service-specific client in an Azure Functions application:

  • NEIN Erstellen Sie keinen neuen Client bei jedem Funktionsaufruf.Do not create a new client with every function invocation.
  • JA Erstellen Sie einen einzelnen, statischen Client, der von jedem Funktionsaufruf verwendet werden kann.Do create a single, static client that every function invocation can use.
  • VIELLEICHT Denken Sie über die Erstellung eines einzelnen, statischen Clients in einer gemeinsamen Hilfsprogrammklasse nach, wenn verschiedene Funktionen den gleichen Dienst verwenden.Consider creating a single, static client in a shared helper class if different functions use the same service.

ClientcodebeispieleClient code examples

Dieser Abschnitt veranschaulicht Best Practices für die Erstellung und Verwendung von Clients über den Funktionscode.This section demonstrates best practices for creating and using clients from your function code.

HttpClient-Beispiel (C#)HttpClient example (C#)

Es folgt ein Beispiel für einen C#-Funktionscode, der eine statische HttpClient-Instanz erstellt:Here's an example of C# function code that creates a static HttpClient instance:

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

Eine häufig gestellte Frage zum HttpClient in .NET lautet: „Soll ich meinen Client löschen?“.A common question about HttpClient in .NET is "Should I dispose of my client?" Im Allgemeinen löschen Sie Objekte, die IDisposable implementieren, wenn Sie sie nicht mehr verwenden.In general, you dispose of objects that implement IDisposable when you're done using them. Sie löschen jedoch keinen statischen Client, da dessen Verwendung mit dem Funktionsende nicht abgeschlossen ist.But you don't dispose of a static client because you aren't done using it when the function ends. Der statische Client soll für die Dauer der Anwendung gültig sein.You want the static client to live for the duration of your application.

HTTP-Agent-Beispiele (JavaScript)HTTP agent examples (JavaScript)

Da die native http.agent-Klasse bessere Optionen für die Verbindungsverwaltung bietet, sollten Sie diese anstelle von nicht nativen Methoden wie etwa dem node-fetch-Modul verwenden.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. Verbindungsparameter werden mithilfe von Optionen in der http.agent-Klasse konfiguriert.Connection parameters are configured through options on the http.agent class. Die genauen Optionen, die für den HTTP-Agent verfügbar sind, finden Sie unter new Agent([options]).For detailed options available with the HTTP agent, see new Agent([options]).

Für die globale http.globalAgent-Klasse, die von http.request() verwendet wird, sind all diese Werte auf ihre jeweiligen Standardwerte festgelegt.The global http.globalAgent class used by http.request() has all of these values set to their respective defaults. Die empfohlene Vorgehensweise zum Konfigurieren von Verbindungsbeschränkungen in Functions besteht darin, global eine maximale Anzahl festzulegen.The recommended way to configure connection limits in Functions is to set a maximum number globally. Das folgende Beispiel legt die maximale Anzahl von Sockets für die Funktions-App fest:The following example sets the maximum number of sockets for the function app:

http.globalAgent.maxSockets = 200;

Das folgende Beispiel erstellt eine neue HTTP-Anforderung mit einem benutzerdefinierten HTTP-Agent nur für diese Anforderung: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);

Codebeispiel für DocumentClient (C#)DocumentClient code example (C#)

DocumentClient stellt eine Verbindung mit einer Azure Cosmos DB-Instanz her.DocumentClient connects to an Azure Cosmos DB instance. In der Azure Cosmos DB-Dokumentation wird empfohlen, dass Sie einen Singleton-Azure Cosmos DB-Client für die Lebensdauer der Anwendung verwenden.The Azure Cosmos DB documentation recommends that you use a singleton Azure Cosmos DB client for the lifetime of your application. Im folgenden Beispiel wird ein Muster dafür in einer Funktion gezeigt: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
}

CosmosClient-Codebeispiel (JavaScript)CosmosClient code example (JavaScript)

CosmosClient stellt eine Verbindung mit einer Azure Cosmos DB-Instanz her.CosmosClient connects to an Azure Cosmos DB instance. In der Azure Cosmos DB-Dokumentation wird empfohlen, dass Sie einen Singleton-Azure Cosmos DB-Client für die Lebensdauer der Anwendung verwenden.The Azure Cosmos DB documentation recommends that you use a singleton Azure Cosmos DB client for the lifetime of your application. Im folgenden Beispiel wird ein Muster dafür in einer Funktion gezeigt:The following example shows one pattern for doing that in a function:

const cosmos = require('@azure/cosmos');
const endpoint = process.env.COSMOS_API_URL;
const masterKey = process.env.COSMOS_API_KEY;
const { CosmosClient } = cosmos;

const client = new CosmosClient({ endpoint, auth: { masterKey } });
// All function invocations also reference the same database and container.
const container = client.database("MyDatabaseName").container("MyContainerName");

module.exports = async function (context) {
    const { result: itemArray } = await container.items.readAll().toArray();
    context.log(itemArray);
}

SqlClient-VerbindungenSqlClient connections

Funktionscode kann den .NET Framework-Datenanbieter für SQL Server (SqlClient) verwenden, um Verbindungen zu einer relationalen SQL-Datenbank herzustellen.Your function code can use the .NET Framework Data Provider for SQL Server (SqlClient) to make connections to a SQL relational database. Dies ist auch der zugrunde liegende Anbieter für Daten-Frameworks, die ADO.NET verwenden, z.B. Entity Framework.This is also the underlying provider for data frameworks that rely on ADO.NET, such as Entity Framework. Im Gegensatz zu HttpClient- und DocumentClient-Verbindungen implementiert ADO.NET standardmäßig das Verbindungspooling.Unlike HttpClient and DocumentClient connections, ADO.NET implements connection pooling by default. Da jedoch noch immer nicht genügend Verbindungen verfügbar sein können, sollten Sie die Verbindungen mit der Datenbank optimieren.But because you can still run out of connections, you should optimize connections to the database. Weitere Informationen finden Sie unter SQL Server-Verbindungspooling (ADO.NET).For more information, see SQL Server Connection Pooling (ADO.NET).

Tipp

Einige Daten-Frameworks, z.B. Entity Framework, rufen Verbindungszeichenfolgen üblicherweise aus dem Abschnitt ConnectionStrings einer Konfigurationsdatei ab.Some data frameworks, such as Entity Framework, typically get connection strings from the ConnectionStrings section of a configuration file. In diesem Fall müssen Sie der Sammlung Verbindungszeichenfolgen der Funktions-App-Einstellungen und der Datei local.settings.json im lokalen Projekt explizit SQL-Datenbank-Verbindungszeichenfolgen hinzufügen.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. Bei der Erstellung einer Instanz von SqlConnection in Ihrem Funktionscode sollten Sie den Verbindungszeichenfolgenwert zusammen mit den anderen Verbindungen in den Anwendungseinstellungen speichern.If you're creating an instance of SqlConnection in your function code, you should store the connection string value in Application settings with your other connections.

Nächste SchritteNext steps

Weitere Informationen zur Empfehlung von statischen Clients finden Sie unter Antimuster für ungeeignete Instanziierung.For more information about why we recommend static clients, see Improper instantiation antipattern.

Weitere Tipps zur Leistungssteigerung von Azure Functions finden Sie unter Optimieren der Leistung und Zuverlässigkeit von Azure Functions.For more Azure Functions performance tips, see Optimize the performance and reliability of Azure Functions.