Zarządzanie połączeniami w usłudze Azure Functions

Funkcje w aplikacji funkcji współdzielą zasoby. Wśród tych udostępnionych zasobów znajdują się połączenia: połączenia HTTP, połączenia z bazą danych i połączenia z usługami, takimi jak Azure Storage. Gdy wiele funkcji jest uruchomionych współbieżnie w planie Zużycie, możliwe jest, że zabraknie dostępnych połączeń. W tym artykule wyjaśniono, jak kodować funkcje, aby uniknąć używania większej liczby połączeń, niż są potrzebne.

Uwaga

Limity połączeń opisane w tym artykule mają zastosowanie tylko w przypadku uruchamiania w planie Zużycie. Jednak techniki opisane w tym miejscu mogą być przydatne w przypadku uruchamiania na dowolnym planie.

Limit połączeń

Liczba dostępnych połączeń w planie Zużycie jest ograniczona częściowo, ponieważ aplikacja funkcji w tym planie działa w środowisku piaskownicy. Jednym z ograniczeń, które piaskownica nakłada na kod, jest ograniczenie liczby połączeń wychodzących, czyli obecnie 600 aktywnych (łącznie 1200) połączeń na wystąpienie. Po osiągnięciu tego limitu środowisko uruchomieniowe funkcji zapisuje w dziennikach następujący komunikat: Host thresholds exceeded: Connections . Aby uzyskać więcej informacji, zobacz Functions service limits (Limity usługi Functions).

Ten limit jest na wystąpienie. Gdy kontroler skalowania dodaje wystąpienia aplikacji funkcji w celu obsługi większej liczby żądań, każde wystąpienie ma niezależny limit połączeń. Oznacza to, że nie ma globalnego limitu połączeń i można mieć znacznie więcej niż 600 aktywnych połączeń we wszystkich aktywnych wystąpieniach.

Podczas rozwiązywania problemów upewnij się, że włączono funkcję Application Szczegółowe informacje dla aplikacji funkcji. Funkcja Szczegółowe informacje umożliwia wyświetlanie metryk dla aplikacji funkcji, takich jak wykonania. Aby uzyskać więcej informacji, zobacz Wyświetlanie telemetrii w programie Application Szczegółowe informacje.

Klienci statyczni

Aby uniknąć utrzymywania większej liczby połączeń niż jest to konieczne, należy ponownie użyć wystąpień klienta zamiast tworzyć nowe z każdym wywołaniami funkcji. Zalecamy ponowne używanie połączeń klienckich dla dowolnego języka, w jakim możesz napisać funkcję. Na przykład klienci platformy .NET, np. HttpClient, DocumentClienti Azure Storage, mogą zarządzać połączeniami, jeśli używasz jednego klienta statycznego.

Oto kilka wskazówek, które należy wykonać w przypadku korzystania z klienta specyficznego dla usługi w Azure Functions aplikacji:

  • Nie należy tworzyć nowego klienta przy każdym wywołaniach funkcji.
  • Należy utworzyć jednego, statycznego klienta, z których może korzystać każde wywołania funkcji.
  • Rozważ utworzenie pojedynczego, statycznego klienta w udostępnionej klasie pomocnika, jeśli różne funkcje używają tej samej usługi.

Przykłady kodu klienta

W tej sekcji pokazano najlepsze rozwiązania dotyczące tworzenia i używania klientów z kodu funkcji.

Żądania HTTP

Oto przykład kodu funkcji języka C#, który tworzy statyczne wystąpienie obiektu HttpClient:

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

Często zadawane pytania dotyczące klienta HttpClient na platformie .NET to "Czy należy usunąć klienta?". Ogólnie rzecz biorąc, obiekty implementowane po ich użyciu IDisposable są usuwane. Nie usuwasz jednak statycznego klienta, ponieważ nie możesz go używać po zakończeniu działania funkcji. Chcesz, aby klient statyczny był dynamiczny przez cały czas działania aplikacji.

Klienci usługi Azure Cosmos DB

Usługa CosmosClient nawiązuje połączenie z wystąpieniem usługi Azure Cosmos DB. W dokumentacji usługi Azure Cosmos DB zaleca się używanie pojedynczego klienta usługi Azure Cosmos DB przez cały okres istnienia aplikacji. W poniższym przykładzie pokazano jeden wzorzec wykonywania tej czynności w funkcji:

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

Ponadto utwórz plik o nazwie "function.proj" dla wyzwalacza i dodaj zawartość poniżej:


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

Połączenia SqlClient

Kod funkcji może używać .NET Framework Dostawca danych dla SQL Server(SqlClient)w celu nawiązań połączeń z SQL relacyjnej bazy danych. Jest to również podstawowy dostawca dla platform danych, które polegają na ADO.NET, takich jak Entity Framework. W przeciwieństwie do połączeń HttpClient i DocumentClient ADO.NET domyślnie implementuje pulę połączeń. Jednak ze względu na to, że nadal można zabraknie połączeń, należy zoptymalizować połączenia z bazą danych. Aby uzyskać więcej informacji, zobacz SQL Server Puli połączeń (ADO.NET).

Porada

Niektóre struktury danych, takie jak Entity Framework, zwykle uzyskają parametry połączenia z sekcji ConnectionStrings pliku konfiguracji. W takim przypadku należy jawnie dodać parametry połączenia bazy SQL do kolekcji Parametry połączenia ustawień aplikacji funkcji i w pliku local.settings.json w projekcie lokalnym. Jeśli tworzysz wystąpienie sqlconnection w kodzie funkcji, należy przechowywać wartość parametrów połączenia w ustawieniach aplikacji z innymi połączeniami.

Następne kroki

Aby uzyskać więcej informacji o tym, dlaczego zaleca się klientów statycznych, zobacz Niewłaściwy antywłasek do obsługi wystąpienia.

Aby uzyskać Azure Functions porady dotyczące wydajności, zobacz Optymalizowanie wydajnościi niezawodności Azure Functions .