Mengelola koneksi di Azure Functions

Fungsi dalam aplikasi fungsi sumber daya bersama. Di antara sumber daya bersama tersebut adalah koneksi: koneksi HTTP, koneksi database, dan koneksi ke layanan seperti Azure Storage. Ketika terdapat banyak fungsi yang berjalan bersamaan dalam sebuah paket Pemakaian, Anda mungkin kehabisan koneksi yang tersedia. Artikel ini menjelaskan cara membuat kode fungsi Anda untuk menghindari penggunaan lebih banyak koneksi daripada yang dibutuhkan.

Catatan

Batas koneksi yang dijelaskan dalam artikel ini hanya berlaku ketika berjalan dalam Paket pemakaian. Namun, teknik yang dijelaskan di sini mungkin bermanfaat ketika menjalankan paket apa pun.

Batas koneksi

Jumlah koneksi yang tersedia pada paket Pemakaian dibatasi sebagian karena aplikasi fungsi pada paket ini berjalan di lingkungan kotak pasir. Salah satu batasan yang diberlakukan kotak pasir pada kode Anda adalah batas jumlah koneksi keluar, yang saat ini 600 koneksi aktif (total 1.200) per instans. Ketika Anda mencapai batas ini, runtime fungsi menulis pesan berikut ke log: Host thresholds exceeded: Connections. Untuk informasi selengkapnya, lihat batas layanan Functions.

Batas ini adalah per instans. Saat pengontrol skala menambahkan instans aplikasi fungsi untuk menangani lebih banyak permintaan, setiap instans memiliki batas koneksi independen. Itu berarti tidak ada batas koneksi global, dan Anda dapat memiliki lebih dari 600 koneksi aktif di semua instans aktif.

Saat memecahkan masalah, pastikan bahwa Anda telah mengaktifkan Application Insights untuk aplikasi fungsi Anda. Application Insights memungkinkan Anda menampilkan metrik untuk aplikasi fungsi Anda seperti eksekusi. Untuk informasi selengkapnya, lihat Menampilkan telemetri di Application Insights.

Klien statik

Untuk menghindari memegang lebih banyak koneksi daripada yang diperlukan, gunakan kembali instans klien daripada membuat yang baru dengan setiap invokasi fungsi. Kami menyarankan untuk menggunakan kembali koneksi klien untuk bahasa apa pun yang mungkin Anda gunakan untuk menulis fungsi Anda. Misalnya, klien .NET seperti klien HttpClient, DocumentClient, dan Azure Storage dapat mengelola koneksi jika Anda menggunakan klien statik tunggal.

Berikut adalah beberapa panduan untuk diikuti saat Anda menggunakan klien khusus layanan di aplikasi Azure Functions:

  • Jangan membuat klien baru dengan setiap invokasi fungsi.
  • Buat klien statik tunggal yang dapat digunakan oleh setiap invokasi fungsi.
  • Pertimbangkan untuk membuat klien statik tunggal di kelas pembantu bersama jika fungsi yang berbeda menggunakan layanan yang sama.

Contoh kode klien

Bagian ini menunjukkan praktik terbaik untuk membuat dan menggunakan klien dari kode fungsi Anda.

Permintaan HTTP

Berikut adalah contoh kode fungsi C# yang membuat instans HttpClient statik:

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

Pertanyaan umum mengenai HttpClient di .NET adalah "Apa saya harus membuang klien saya?" Secara umum, Anda membuang objek yang menerapkan IDisposable ketika Anda sudah selesai menggunakannya. Tetapi Anda tidak membuang klien statik karena Anda belum selesai menggunakannya ketika fungsi berakhir. Anda ingin klien statik hidup selama aplikasi Anda.

Klien Azure Cosmos DB

CosmosClient terhubung ke instans Azure Cosmos DB. Dokumentasi Azure Cosmos DB merekomendasikan agar Anda menggunakan klien Azure Cosmos DB database tunggal selama masa pakai aplikasi Anda. Contoh berikut memperlihatkan satu pola untuk melakukan itu dalam fungsi:

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

Selain itu, buat file bernama "function.proj" untuk pemicu Anda dan tambahkan konten di bawah ini:


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

Koneksi SqlClient

Kode fungsi Anda dapat menggunakan Penyedia Data .NET Framework untuk SQL Server (SqlClient) untuk membuat koneksi ke database hubungan SQL. Ini juga merupakan penyedia yang mendasari kerangka kerja data yang mengandalkan ADO.NET, seperti Kerangka Kerja Entitas. Tidak seperti koneksi HttpClient dan DocumentClient, ADO.NET menerapkan kumpulan koneksi secara default. Tetapi karena Anda masih bisa kehabisan koneksi, Anda harus mengoptimalkan koneksi ke database. Untuk informasi selengkapnya, lihat Kumpulan Koneksi SQL Server (ADO.NET).

Tip

Beberapa kerangkakerja data, seperti Kerangka Kerja Entitas, biasanya mendapatkan string koneksi dari bagian ConnectionStrings dari file konfigurasi. Dalam hal ini, Anda harus secara eksplisit menambahkan string koneksi database SQL ke koleksi string Koneksi dari pengaturan aplikasi fungsi Anda dan di file local.settings.json di proyek lokal Anda. Jika Anda membuat instans SqlConnection dalam kode fungsi, Anda harus menyimpan nilai string koneksi di pengaturan Aplikasi dengan koneksi Anda yang lain.

Langkah berikutnya

Untuk informasi selengkapnya tentang mengapa kami merekomendasikan klien statik, lihat Antipattern instansiasi yang tidak tepat.

Untuk tips performa Azure Functions lainnya, lihat Mengoptimalkan performa dan keandalan Azure Functions.