Správa připojení ve službě Azure Functions

Funkce v aplikaci funkcí sdílejí prostředky. Mezi tyto sdílené prostředky patří připojení: připojení HTTP, připojení k databázi a připojení ke službám, jako je Azure Storage. Pokud je v plánu Consumption současně spuštěno mnoho funkcí, je možné, že dojde k vypršení dostupných připojení. Tento článek vysvětluje, jak kódovat funkce, aby se zabránilo použití více připojení, než potřebují.

Poznámka

Omezení připojení popsaná v tomto článku platí jenom při spuštění v plánu Consumption. Zde popsané techniky však mohou být užitečné při spuštění libovolného plánu.

Limit připojení

Počet dostupných připojení v plánu Consumption je omezený částečně proto, že aplikace funkcí v tomto plánu běží v prostředí sandboxu. Jedním z omezení, která sandbox ukládá vašemu kódu, je omezení počtu odchozích připojení, které je aktuálně 600 aktivních (celkem 1 200) připojení na instanci. Když dosáhnete tohoto limitu, modul runtime funkcí zapíše do protokolů následující zprávu: Host thresholds exceeded: Connections. Další informace najdete v tématu Omezení služby Functions.

Tento limit platí pro jednotlivé instance. Když kontroler škálování přidá instance aplikace funkcí pro zpracování více požadavků, každá instance má nezávislý limit připojení. To znamená, že neexistuje žádný globální limit připojení a ve všech aktivních instancích můžete mít mnohem více než 600 aktivních připojení.

Při řešení potíží se ujistěte, že jste pro aplikaci funkcí povolili Application Insights. Application Insights umožňuje zobrazit metriky aplikací funkcí, jako jsou spouštění. Další informace najdete v tématu Zobrazení telemetrie v Application Insights.

Statici klienti

Abyste se vyhnuli uchovávání více připojení, než je nutné, znovu použijte instance klienta místo vytváření nových instancí s každou vyvolání funkce. Doporučujeme opakovaně používat připojení klientů pro jakýkoli jazyk, ve kterém můžete funkci zapsat. Například klienti .NET, jako jsou klienti HttpClient, DocumentClient a Azure Storage, můžou spravovat připojení, pokud používáte jednoho statického klienta.

Tady je několik pokynů, které je potřeba dodržovat, když v Azure Functions aplikaci používáte klienta specifického pro službu:

  • Nevytvažujte nového klienta s každým vyvoláním funkce.
  • Vytvořte jednoho statického klienta, kterého může použít každé vyvolání funkce.
  • Pokud různé funkce používají stejnou službu, zvažte vytvoření jednoho statického klienta ve sdílené pomocné třídě.

Příklady kódu klienta

Tato část ukazuje osvědčené postupy pro vytváření a používání klientů z kódu funkce.

Požadavky HTTP

Tady je příklad kódu funkce jazyka C#, který vytvoří statickou instanci 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
}

Běžná otázka týkající se HttpClient v .NET zní: "Mám se zbavit svého klienta?" Obecně platí, že máte k dispozici objekty, které se implementují IDisposable , až je budete používat. Statického klienta ale nelikvidujete, protože až funkce skončí, nebudete ho používat. Chcete, aby statický klient byl aktivní po dobu trvání vaší aplikace.

Klienti Služby Azure Cosmos DB

CosmosClient se připojí k instanci Služby Azure Cosmos DB. Dokumentace ke službě Azure Cosmos DB doporučuje , abyste po celou dobu životnosti aplikace používali samostatného klienta Azure Cosmos DB. Následující příklad ukazuje jeden vzor, jak to udělat ve funkci:

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

Vytvořte také soubor s názvem function.proj pro trigger a přidejte následující obsah:


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

Připojení SqlClient

Kód funkce může pomocí zprostředkovatele dat rozhraní .NET Framework pro SQL Server (SqlClient) vytvářet připojení k relační databázi SQL. Toto je také základní poskytovatel pro datové architektury, které závisí na ADO.NET, jako je Entity Framework. Na rozdíl od připojení HttpClient a DocumentClient ADO.NET ve výchozím nastavení implementuje sdružování připojení. Ale protože stále můžou docházet připojení, měli byste optimalizovat připojení k databázi. Další informace najdete v tématu SQL Server sdružování připojení (ADO.NET).

Tip

Některá datová rozhraní, například Entity Framework, obvykle získávají připojovací řetězce z části ConnectionStrings konfiguračního souboru. V takovém případě musíte explicitně přidat připojovací řetězce databáze SQL do kolekce Připojovací řetězce nastavení aplikace funkcí a do souboru local.settings.json v místním projektu. Pokud vytváříte instanci SqlConnection v kódu funkce, měli byste hodnotu připojovacího řetězce uložit v nastavení aplikace s ostatními připojeními.

Další kroky

Další informace o tom, proč doporučujeme statické klienty, najdete v tématu Antipattern pro nesprávnou instanci.

Další tipy k výkonu Azure Functions najdete v tématu Optimalizace výkonu a spolehlivosti Azure Functions.