Udostępnij za pośrednictwem


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

Funkcje w aplikacji funkcji udostępniają zasoby. Wśród tych zasobów udostępnionych są połączenia: połączenia HTTP, połączenia bazy danych i połączenia z usługami, takimi jak Azure Storage. Jeśli wiele funkcji jest uruchomionych współbieżnie w planie Zużycie, możliwe jest wyczerpanie 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ć korzystne podczas uruchamiania w dowolnym planie.

Limit połączeń

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

Ten limit jest na wystąpienie. Gdy kontroler skalowania dodaje wystąpienia aplikacji funkcji do 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 usługę Application Insights dla aplikacji funkcji. Usługa Application Insights umożliwia wyświetlanie metryk dla aplikacji funkcji, takich jak wykonania. Aby uzyskać więcej informacji, zobacz Wyświetlanie danych telemetrycznych w usłudze Application Insights.

Klienci statyczni

Aby uniknąć przechowywania większej liczby połączeń niż jest to konieczne, użyj ponownie wystąpień klienta zamiast tworzyć nowe z każdym wywołaniem funkcji. Zalecamy ponowne używanie połączeń klienta dla dowolnego języka, w którym można napisać funkcję. Na przykład klienci platformy .NET, tacy jak HttpClient, DocumentClient i Azure Storage, mogą zarządzać połączeniami, jeśli używasz jednego klienta statycznego.

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

  • Nie należy tworzyć nowego klienta z każdym wywołaniem funkcji.
  • Utwórz pojedynczego, statycznego klienta, którego może używać każda wywołanie funkcji.
  • Rozważ utworzenie pojedynczego, statycznego klienta w udostępnionej klasie pomocniczej, jeśli różne funkcje korzystają z tej samej usługi.

Przykłady kodu klienta

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

Żądania HTTP

Oto przykład kodu funkcji języka C#, który tworzy statyczne wystąpienie klienta 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
}

Typowym pytaniem dotyczącym klienta HttpClient na platformie .NET jest "Czy powinienem usunąć mojego klienta?" Ogólnie rzecz biorąc, usuwasz obiekty implementujące IDisposable je po zakończeniu ich używania. Nie usuwasz jednak klienta statycznego, ponieważ nie używasz go po zakończeniu działania funkcji. Chcesz, aby klient statyczny żył przez czas trwania aplikacji.

Klienci usługi Azure Cosmos DB

Klient CosmosClient łączy się 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 poniższą zawartość:


<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ć programu .NET Framework Dostawca danych dla programu SQL Server (SqlClient) do nawiązywania połączeń z relacyjną bazą danych SQL. Jest to również podstawowy dostawca struktur danych korzystających z ADO.NET, takich jak Entity Framework. W przeciwieństwie do połączeń HttpClient i DocumentClient ADO.NET domyślnie implementuje buforowanie połączeń. Ale ponieważ nadal można zabrakło połączeń, należy zoptymalizować połączenia z bazą danych. Aby uzyskać więcej informacji, zobacz Sql Server Connection Pooling (ADO.NET).

Napiwek

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

Następne kroki

Aby uzyskać więcej informacji na temat tego, dlaczego zalecamy klientom statycznym, zobacz Niewłaściwy antywzorzec tworzenia wystąpienia.

Aby uzyskać więcej wskazówek dotyczących wydajności usługi Azure Functions, zobacz Optymalizowanie wydajności i niezawodności usługi Azure Functions.