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żna zabrakło dostępnych połączeń. W tym artykule wyjaśniono, jak kodować funkcje, aby uniknąć używania większej liczby połączeń niż są one potrzebne.

Uwaga

Limity połączeń opisane w tym artykule mają zastosowanie tylko w przypadku uruchamiania w planie zużycie. Jednak techniki opisane tutaj mogą być korzystne podczas uruchamiania w 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ń nakładanych przez piaskownicę na kod jest ograniczenie liczby połączeń wychodzących, które obecnie jest 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łączenia. Oznacza to, że nie ma globalnego limitu połączeń i może istnieć ponad 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 telemetrii w usłudze Application Insights.

Klienci statyczni

Aby uniknąć przechowywania większej liczby połączeń niż to konieczne, użyj ponownie wystąpień klienta, a nie utwórz nowych z każdym wywołaniem funkcji. Zalecamy ponowne użycie 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 pojedynczego, statycznego klienta.

Poniżej przedstawiono kilka wskazówek, które należy wykonać podczas korzystania z klienta specyficznego dla usługi w aplikacji 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 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
}

Typowe pytanie dotyczące klienta HttpClient na platformie .NET to "Czy powinienem usunąć mojego klienta?" Ogólnie rzecz biorąc, usuwa się obiekty implementujące IDisposable po zakończeniu ich używania. Nie usuwasz jednak statycznego klienta, ponieważ nie robisz go, gdy funkcja kończy się. Chcesz, aby klient statyczny żył przez czas trwania aplikacji.

Klienci usługi Azure Cosmos DB

Obiekt CosmosClient łączy się z wystąpieniem usługi Azure Cosmos DB. Dokumentacja usługi Azure Cosmos DB zaleca użycie 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ć dostawcy danych .NET Framework dla SQL Server (SqlClient), aby nawiązać połączenia z relacyjną bazą danych SQL. Jest to również podstawowy dostawca dla struktur danych, które opierają się na ADO.NET, takich jak Entity Framework. W przeciwieństwie do połączeń HttpClient i DocumentClient , ADO.NET domyślnie implementuje buforowanie połączeń. Jednak 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).

Porada

Niektóre struktury danych, takie jak Entity Framework, zwykle 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, 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 zalecamy klientom statycznym, zobacz Niepoprawne antywzorctwo tworzenia wystąpień.

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