Kapcsolatok kezelése az Azure Functionsben

A függvényalkalmazás függvényei erőforrásokat osztanak meg. A megosztott erőforrások között vannak kapcsolatok: HTTP-kapcsolatok, adatbázis-kapcsolatok és olyan szolgáltatásokhoz való kapcsolatok, mint az Azure Storage. Ha egy használatalapú csomagban számos függvény fut egyidejűleg, előfordulhat, hogy elfogynak az elérhető kapcsolatok. Ez a cikk bemutatja, hogyan kódolni a függvényeket, hogy elkerülje a szükségesnél több kapcsolat használatát.

Megjegyzés

A cikkben ismertetett kapcsolati korlátok csak használatalapú csomagban való futtatáskor érvényesek. Az itt leírt technikák azonban hasznosak lehetnek, ha bármilyen terven futnak.

Kapcsolati korlát

A használatalapú csomagban elérhető kapcsolatok száma részben azért korlátozott, mert a csomag egyik függvényalkalmazása tesztkörnyezetben fut. A tesztkörnyezet által a kódra vonatkozó korlátozások egyike a kimenő kapcsolatok számának korlátozása, amely példányonként jelenleg 600 aktív (összesen 1200) kapcsolat. Ha eléri ezt a korlátot, a függvény-futtatókörnyezet a következő üzenetet írja a naplókba: Host thresholds exceeded: Connections. További információ: A Functions szolgáltatás korlátai.

Ez a korlát példányonként van megadva. Amikor a skálázási vezérlő függvényalkalmazás-példányokat ad hozzá a további kérések kezeléséhez, minden példányhoz külön kapcsolati korlát tartozik. Ez azt jelenti, hogy nincs globális kapcsolati korlát, és sokkal több mint 600 aktív kapcsolat lehet az összes aktív példányon.

A hibaelhárítás során győződjön meg arról, hogy engedélyezte az Application Insights szolgáltatást a függvényalkalmazáshoz. Az Application Insights lehetővé teszi a függvényalkalmazások, például a végrehajtások metrikáinak megtekintését. További információ: Telemetriai adatok megtekintése az Application Insightsban.

Statikus ügyfelek

A szükségesnél több kapcsolat megtartásának elkerülése érdekében használja újra az ügyfélpéldányokat ahelyett, hogy minden függvényhívással újakat hoz létre. Javasoljuk, hogy az ügyfélkapcsolatokat minden olyan nyelvhez újrahasználja, amelybe a függvényt írhatja. A .NET-ügyfelek, például a HttpClient, a DocumentClient és az Azure Storage-ügyfelek kezelhetik a kapcsolatokat, ha egyetlen statikus ügyfelet használ.

Az alábbiakban néhány útmutatást követünk, amikor szolgáltatásspecifikus ügyfelet használ egy Azure Functions alkalmazásban:

  • Ne hozzon létre új ügyfelet minden függvényhívással.
  • Hozzon létre egyetlen statikus ügyfelet, amelyet minden függvényhívás használhat.
  • Érdemes lehet egyetlen statikus ügyfelet létrehozni egy megosztott segédosztályban, ha a különböző függvények ugyanazt a szolgáltatást használják.

Ügyfélkód példák

Ez a szakasz az ügyfelek függvénykódból történő létrehozására és használatára vonatkozó ajánlott eljárásokat mutatja be.

HTTP-kérések

Íme egy példa egy C#-függvénykódra, amely statikus HttpClient-példányt hoz létre:

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

A HttpClient .NET-ben való használatával kapcsolatos gyakori kérdés a következő: "Szabad-e megszabadulni az ügyfelemtől?" Általában a használatuk után implementálható IDisposable objektumokat kell megsemmisíteni. A statikus ügyfeleket azonban nem szabadíthatja fel, mert a függvény befejeződésekor még nem használja. Azt szeretné, hogy a statikus ügyfél az alkalmazás időtartama alatt is működőképes legyen.

Azure Cosmos DB-ügyfelek

A CosmosClient egy Azure Cosmos DB-példányhoz csatlakozik. Az Azure Cosmos DB dokumentációja azt javasolja, hogy egy egyszeri Azure Cosmos DB-ügyfelet használjon az alkalmazás teljes élettartama alatt. Az alábbi példában egy minta látható, amely ezt egy függvényben hajtja végre:

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

Emellett hozzon létre egy "function.proj" nevű fájlt az eseményindítóhoz, és adja hozzá az alábbi tartalmat:


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

SqlClient-kapcsolatok

A függvénykód a SQL Server (SqlClient) .NET-keretrendszer adatszolgáltatóját használhatja az SQL relációs adatbázissal való kapcsolatok létrehozásához. Ez a ADO.NET, például az Entity Frameworkre támaszkodó adatkeretek mögöttes szolgáltatója is. A HttpClient - és DocumentClient-kapcsolatoktól eltérően a ADO.NET alapértelmezés szerint implementálja a kapcsolatkészletezést. Mivel azonban továbbra is elfogyhatnak a kapcsolatok, optimalizálnia kell az adatbázis kapcsolatait. További információ: SQL Server kapcsolatkészletezés (ADO.NET).

Tipp

Egyes adat-keretrendszerek, például az Entity Framework általában egy konfigurációs fájl ConnectionStrings szakaszából szerzik be a kapcsolati sztringeket. Ebben az esetben explicit módon hozzá kell adnia az SQL-adatbázis kapcsolati sztringeit a függvényalkalmazás beállításainak Kapcsolati sztringek gyűjteményéhez és a helyi projekt local.settings.json fájljához . Ha sqlConnection-példányt hoz létre a függvénykódban, a kapcsolati sztring értéket az Alkalmazásbeállításokban kell tárolnia a többi kapcsolattal együtt.

Következő lépések

További információ arról, hogy miért javasoljuk a statikus ügyfelek használatát, tekintse meg a nem megfelelő példányosítási kizárási szűrőt ismertető cikket.

További Azure Functions teljesítménnyel kapcsolatos tippekért lásd: A Azure Functions teljesítményének és megbízhatóságának optimalizálása.