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 spuštěno mnoho funkcí současně, je možné narazit na dostupná připojení. Tento článek vysvětluje, jak kódovat funkce, aby se zabránilo používání více připojení, než potřebují.

Poznámka:

Omezení připojení popsaná v tomto článku platí jenom v případě, že běží v plánu Consumption. Techniky popsané zde však můžou 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 částečně omezený, protože aplikace funkcí v tomto plánu běží v sandboxovém prostředí. Jedním z omezení, která sandbox pro váš kód ukládá, je limit počtu odchozích připojení, která jsou aktuálně aktivní 600 (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 omezeních služby Functions.

Toto omezení platí pro každou instanci. Když řadič š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 povolili Application Insights pro vaši aplikaci funkcí. Application Insights umožňuje zobrazit metriky pro aplikace funkcí, jako jsou spouštění. Další informace najdete v tématu Zobrazení telemetrie v Application Insights.

Statické klienty

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

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

  • Nevytvořte nového klienta s každým vyvoláním funkce.
  • Vytvořte jednoho statického klienta, který 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 klientského kódu

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ěžnou otázkou týkající se HttpClient v .NET je "Mám odstranit klienta?" Obecně platí, že odstraníte objekty, které implementují IDisposable , když je použijete. Statického klienta ale nelikvidujete, protože ho nepoužíváte, když funkce skončí. Chcete, aby statický klient žil po dobu trvání vaší aplikace.

Klienti Azure Cosmos DB

CosmosClient se připojuje k instanci služby Azure Cosmos DB. Dokumentace ke službě Azure Cosmos DB doporučuje používat jednoúčelového klienta Azure Cosmos DB po celou dobu životnosti vaší aplikace. Následující příklad ukazuje jeden vzor pro to 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 použít rozhraní .NET Framework Zprostředkovatel dat pro SQL Server (SqlClient) k vytvoření připojení k relační databázi SQL. Jedná se také o základního zprostředkovatele datových architektur, které se spoléhají 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í. Vzhledem k tomu, že stále dochází k výpadkům připojení, měli byste optimalizovat připojení k databázi. Další informace najdete v tématu Sdružování připojení k SQL Serveru (ADO.NET).

Tip

Některé datové architektury, jako je Entity Framework, obvykle získávají připojovací řetězec z části ConnectionStrings konfiguračního souboru. V tomto případě musíte explicitně přidat databáze SQL připojovací řetězec 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 uložit hodnotu připojovací řetězec v nastavení aplikace s ostatními připojeními.

Další kroky

Další informace o tom, proč doporučujeme statické klienty, naleznete v tématu Nesprávné vytváření instancí antipattern.

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