Azure İşlevleri'nde bağlantıları yönetme

İşlev uygulamasındaki işlevler kaynakları paylaşır. Bu paylaşılan kaynaklar arasında bağlantılar vardır: HTTP bağlantıları, veritabanı bağlantıları ve Azure Depolama gibi hizmetlere yönelik bağlantılar. Tüketim planında birçok işlev eşzamanlı olarak çalıştırıldığında, kullanılabilir bağlantıların tükenmesi mümkündür. Bu makalede, işlevlerinizi ihtiyaç duyduklarından daha fazla bağlantı kullanmaktan kaçınmak için nasıl kodladıklarınız açıklanmaktadır.

Not

Bu makalede açıklanan bağlantı sınırları yalnızca Tüketim planında çalıştırılırken geçerlidir. Ancak, burada açıklanan teknikler herhangi bir plan üzerinde çalışırken yararlı olabilir.

Bağlantı sınırı

Tüketim planındaki kullanılabilir bağlantı sayısı kısmen sınırlıdır çünkü bu plandaki bir işlev uygulaması korumalı alan ortamında çalışır. Korumalı alanın kodunuz üzerinde uyguladığı kısıtlamalardan biri, şu anda örnek başına 600 etkin (toplam 1.200) bağlantı olan giden bağlantı sayısı sınırıdır. Bu sınıra ulaştığınızda, işlevler çalışma zamanı günlüklere şu iletiyi yazar: Host thresholds exceeded: Connections. Daha fazla bilgi için bkz. İşlevler hizmet sınırları.

Bu sınır örnek başınadır. Ölçek denetleyicisi daha fazla isteği işlemek için işlev uygulaması örnekleri eklediğinde, her örneğin bağımsız bir bağlantı sınırı vardır. Bu, genel bağlantı sınırı olmadığı ve tüm etkin örneklerde 600'den fazla etkin bağlantınız olabileceği anlamına gelir.

Sorun giderme sırasında, işlev uygulamanız için Application Insights'ı etkinleştirdiğinizden emin olun. Application Insights, yürütmeler gibi işlev uygulamalarınız için ölçümleri görüntülemenizi sağlar. Daha fazla bilgi için bkz . Application Insights'ta telemetriyi görüntüleme.

Statik istemciler

Gerekenden daha fazla bağlantı tutmaktan kaçınmak için, her işlev çağrısıyla yenilerini oluşturmak yerine istemci örneklerini yeniden kullanın. İşlevinizi yazabileceğiniz herhangi bir dil için istemci bağlantılarını yeniden kullanmanızı öneririz. Örneğin, HttpClient, DocumentClient ve Azure Depolama istemcileri gibi .NET istemcileri, tek bir statik istemci kullanıyorsanız bağlantıları yönetebilir.

Azure İşlevleri bir uygulamada hizmete özgü bir istemci kullanırken izleyebileceğiniz bazı yönergeler şunlardır:

  • Her işlev çağrısıyla yeni bir istemci oluşturmayın.
  • Her işlev çağrısının kullanabileceği tek bir statik istemci oluşturun.
  • Farklı işlevler aynı hizmeti kullanıyorsa paylaşılan bir yardımcı sınıfında tek bir statik istemci oluşturmayı göz önünde bulundurun .

İstemci kodu örnekleri

Bu bölümde, işlev kodunuzdan istemci oluşturmaya ve kullanmaya yönelik en iyi yöntemler gösterilmektedir.

HTTP istekleri

Statik bir HttpClient örneği oluşturan C# işlev kodu örneği aşağıda verilmiştir:

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

.NET'te HttpClient ile ilgili yaygın bir soru şudur: "İstemcimi atayım mı?" Genel olarak, bunları kullanmayı bitirdiğinizde uygulanan IDisposable nesneleri atabilirsiniz. Ancak statik istemciyi atmazsınız çünkü işlev sona erdiğinde bu istemciyi kullanmayı bitirmezsiniz. Statik istemcinin uygulamanızın süresi boyunca yaşamasını istiyorsunuz.

Azure Cosmos DB istemcileri

CosmosClient bir Azure Cosmos DB örneğine bağlanır. Azure Cosmos DB belgeleri, uygulamanızın ömrü boyunca tek bir Azure Cosmos DB istemcisi kullanmanızı önerir. Aşağıdaki örnekte, bir işlevde bunu yapmak için bir desen gösterilmektedir:

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

Ayrıca tetikleyiciniz için "function.proj" adlı bir dosya oluşturun ve aşağıdaki içeriği ekleyin:


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

SqlClient bağlantıları

İşlev kodunuz SQL Server (SqlClient) için .NET Framework Veri Sağlayıcısı kullanarak SQL ilişkisel veritabanına bağlantı oluşturabilir. Bu, Entity Framework gibi ADO.NET kullanan veri çerçeveleri için de temel alınan sağlayıcıdır. HttpClient ve DocumentClient bağlantılarından farklı olarak, ADO.NET varsayılan olarak bağlantı havuzu uygular. Ancak yine de bağlantınız tükenebileceğinden, veritabanı bağlantılarını iyileştirmeniz gerekir. Daha fazla bilgi için bkz . SQL Server Bağlantı Havuzu (ADO.NET).

İpucu

Entity Framework gibi bazı veri çerçeveleri genellikle yapılandırma dosyasının ConnectionStrings bölümünden bağlantı dizesi alır. Bu durumda, SQL veritabanı bağlantı dizesi'lerini işlev uygulaması ayarlarınızın Bağlantı dizeleri koleksiyonuna ve yerel projenizdeki local.settings.json dosyasına açıkça eklemeniz gerekir. İşlev kodunuzda bir SqlConnection örneği oluşturuyorsanız, bağlantı dizesi değerini diğer bağlantılarınızla birlikte Uygulama ayarlarında depolamanız gerekir.

Sonraki adımlar

Statik istemcileri neden önerdiğimiz hakkında daha fazla bilgi için bkz . Hatalı örnek oluşturma kötü modeli.

Daha Azure İşlevleri performans ipuçları için bkz. Azure İşlevleri performansını ve güvenilirliğini iyileştirme.