Tingkatkan performa dan keandalan Azure Functions

Artikel ini menyediakan panduan untuk meningkatkan kinerja dan keandalan aplikasi fungsi tanpa server Anda. Untuk serangkaian praktik terbaik Azure Functions yang lebih umum, lihat praktik terbaik Azure Functions.

Berikut ini adalah praktik terbaik dalam cara Anda membangun dan merancang solusi tanpa server Menggunakan Azure Functions.

Hindari fungsi jangka panjang

Fungsi jangka panjang yang besar dapat menyebabkan masalah waktu habis yang tidak terduga. Untuk mempelajari selengkapnya tentang batas waktu untuk paket hosting tertentu, lihat durasi batas waktu aplikasi fungsi.

Sebuah fungsi bisa menjadi besar karena banyak Node.js ketergantungan. Mengimpor dependensi juga dapat menyebabkan peningkatan waktu muat yang mengakibatkan batas waktu yang tidak terduga. Dependensi dimuat baik secara eksplisit maupun implisit. Satu modul yang dimuat oleh kode Anda dapat memuat modul tambahannya sendiri.

Jika memungkinkan, refaktor fungsi besar menjadi set fungsi yang lebih kecil yang bekerja bersama dan mengembalikan respons dengan cepat. Misalnya, fungsi webhook atau pemicu HTTP mungkin memerlukan respons pengakuan dalam batas waktu tertentu; adalah umum bagi webhooks untuk memerlukan respons segera. Anda dapat meneruskan muatan pemicu HTTP ke dalam antrean untuk diproses oleh fungsi pemicu antrean. Pendekatan ini memungkinkan Anda menunda pekerjaan yang sebenarnya dan mengembalikan respons langsung.

Pastikan tugas latar belakang selesai

Saat fungsi Anda memulai tugas, panggilan balik, utas, proses, fungsi harus diselesaikan sebelum kode fungsi Anda kembali. Karena Functions tidak melacak utas latar belakang ini, pematian situs dapat terjadi terlepas dari status utas latar belakang, yang dapat menyebabkan perilaku yang tidak diinginkan dalam fungsi Anda.

Misalnya, jika fungsi memulai tugas latar belakang dan mengembalikan respons yang berhasil sebelum tugas selesai, runtime Functions menganggap eksekusi telah berhasil diselesaikan, terlepas dari hasil tugas latar belakang. Jika tugas latar belakang ini melakukan pekerjaan penting, tugas ini mungkin didahulukan oleh penonaktifan situs, membiarkan pekerjaan tersebut dalam keadaan tidak diketahui.

Komunikasi lintas fungsi

Fungsi yang Tahan Lama dan Aplikasi Logika Azure dibuat untuk mengelola transisi status dan komunikasi antara beberapa fungsi.

Jika tidak menggunakan Durable Functions atau Logic Apps untuk diintegrasikan dengan beberapa fungsi, yang terbaik adalah menggunakan antrean penyimpanan untuk komunikasi lintas fungsi. Alasan utamanya adalah bahwa antrean penyimpanan lebih murah dan jauh lebih mudah untuk disediakan daripada opsi penyimpanan lainnya.

Pesan individual dalam antrean penyimpanan dibatasi dalam ukuran hingga 64 KB. Jika Anda perlu meneruskan pesan yang lebih besar antar fungsi, antrean Azure Service Bus dapat digunakan untuk mendukung ukuran pesan hingga 256 KB di tingkat Standar, dan hingga 100 MB di tingkat Premium.

Topik Service Bus berguna jika Anda memerlukan pemfilteran pesan sebelum diproses.

Hub peristiwa berguna untuk mendukung komunikasi volume tinggi.

Menulis fungsi menjadi tanpa status

Fungsi harus tanpa status dan idempoten jika memungkinkan. Kaitkan informasi status yang diperlukan dengan data Anda. Misalnya, pesanan yang sedang diproses kemungkinan akan memiliki anggota state terkait. Fungsi dapat memproses pesanan berdasarkan keadaan itu sementara fungsi itu sendiri tetap tanpa status.

Fungsi idempoten sangat dianjurkan dengan pemicu timer. Misalnya, jika Anda memiliki sesuatu yang benar-benar harus berjalan sekali sehari, tulislah sehingga dapat berjalan kapan saja di siang hari dengan hasil yang sama. Fungsi ini dapat keluar ketika tidak ada pekerjaan untuk hari tertentu. Juga jika eksekusi sebelumnya gagal diselesaikan, eksekusi berikutnya harus mengambil tempat ia tinggalkan. Ini sangat penting untuk pengikatan berbasis pesan yang mencoba kembali kegagalan. Untuk informasi selengkapnya, lihat Merancang Azure Functions untuk input yang identik.

Tulis fungsi defensif

Asumsikan fungsi Anda dapat menemukan pengecualian kapan saja. Rancang fungsi Anda dengan kemampuan untuk melanjutkan dari titik kegagalan sebelumnya selama eksekusi berikutnya. Pertimbangkan skenario yang memerlukan tindakan berikut:

  1. Kueri untuk 10.000 baris dalam database.
  2. Buat pesan antrean untuk setiap baris tersebut untuk memproses lebih jauh ke bawah garis.

Tergantung pada seberapa kompleks sistem Anda, Anda mungkin memiliki: melibatkan layanan hilir berperilaku buruk, pemadaman jaringan, atau batas kuota tercapai, dll. Semua ini dapat mempengaruhi fungsi Anda kapan saja. Anda perlu merancang fungsi Anda untuk dipersiapkan untuk itu.

Bagaimana reaksi kode Anda jika kegagalan terjadi setelah memasukkan 5.000 item tersebut ke dalam antrean untuk diproses? Lacak item dalam set yang telah Anda selesaikan. Jika tidak, Anda dapat menyisipkannya lagi lain kali. Penyisipan ganda ini dapat berdampak serius pada alur kerja Anda, jadi buat fungsi Anda idempoten.

Jika item antrean sudah diproses, izinkan fungsi Anda menjadi no-op.

Manfaatkan langkah-langkah defensif yang sudah disediakan untuk komponen yang Anda gunakan di platform Azure Functions. Misalnya, lihat Menangani pesan antrean racun dalam dokumentasi untuk pemicu dan pengikatan Antrean Penyimpanan Azure.

Untuk fungsi berbasis HTTP, pertimbangkan strategi penerapan versi API dengan Azure API Management. Misalnya, jika Anda harus memperbarui aplikasi fungsi berbasis HTTP, sebarkan pembaruan baru ke aplikasi fungsi terpisah dan gunakan revisi atau versi API Management untuk mengarahkan klien ke versi atau revisi baru. Setelah semua klien menggunakan versi atau revisi dan tidak ada lagi eksekusi yang tersisa di aplikasi fungsi sebelumnya, Anda dapat membatalkan provisi aplikasi fungsi sebelumnya.

Praktik terbaik organisasi fungsi

Sebagai bagian dari solusi Anda, Anda dapat mengembangkan dan menerbitkan beberapa fungsi. Fungsi-fungsi ini sering digabungkan ke dalam satu aplikasi fungsi, tetapi mereka juga dapat berjalan di aplikasi fungsi terpisah. Dalam paket hosting Premium dan khusus (App Service), beberapa aplikasi fungsi juga dapat berbagi sumber daya yang sama dengan berjalan dalam paket yang sama. Cara mengelompokkan fungsi dan aplikasi fungsi dapat memengaruhi kinerja, penskalaan, konfigurasi, penyebaran, dan keamanan solusi Anda secara keseluruhan. Tidak ada aturan yang berlaku untuk setiap skenario, jadi pertimbangkan informasi di bagian ini saat merencanakan dan mengembangkan fungsi Anda.

Menata fungsi untuk kinerja dan penskalaan

Setiap fungsi yang Anda buat memiliki jejak memori. Meskipun jejak ini biasanya kecil, memiliki terlalu banyak fungsi dalam aplikasi fungsi dapat menyebabkan startup aplikasi Anda yang lebih lambat pada instans baru. Ini juga berarti bahwa penggunaan memori keseluruhan aplikasi fungsi Anda mungkin lebih tinggi. Sulit untuk mengatakan berapa banyak fungsi yang harus dalam satu aplikasi, yang tergantung pada beban kerja khusus Anda. Namun, jika fungsi Anda menyimpan banyak data dalam memori, pertimbangkan untuk memiliki lebih sedikit fungsi dalam satu aplikasi.

Jika Anda menjalankan beberapa aplikasi fungsi dalam satu paket Premium atau paket khusus (Layanan Aplikasi), semua aplikasi ini berbagi sumber daya yang sama yang dialokasikan untuk paket. Jika Anda memiliki satu aplikasi fungsi yang memiliki persyaratan memori yang jauh lebih tinggi daripada yang lain, aplikasi ini menggunakan jumlah sumber daya memori yang tidak proporsional pada setiap instans tempat aplikasi digunakan. Karena ini dapat membuat lebih sedikit memori tersedia untuk aplikasi lain pada setiap instans, Anda mungkin ingin menjalankan aplikasi fungsi menggunakan memori tinggi seperti ini dalam paket hosting terpisah sendiri.

Catatan

Saat menggunakan paket Konsumsi,kami sarankan Anda selalu menempatkan setiap aplikasi dalam paketnya sendiri, karena aplikasi tetap diskalakan secara independen. Untuk informasi selengkapnya, lihat Beberapa aplikasi dalam paket yang sama.

Pertimbangkan apakah Anda ingin mengelompokkan fungsi dengan profil beban yang berbeda. Misalnya, jika Anda memiliki fungsi yang memproses ribuan pesan antrean, dan pesan lain yang hanya dipanggil sesekali tetapi memiliki persyaratan memori tinggi, Anda mungkin ingin menyebarkannya dalam aplikasi fungsi terpisah sehingga mereka mendapatkan serangkaian sumber daya mereka sendiri dan mereka menskalakan secara independen satu sama lain.

Menata fungsi untuk konfigurasi dan penyebaran

Aplikasi fungsi memiliki host.json file, yang digunakan untuk mengonfigurasi perilaku lanjutan pemicu fungsi dan runtime Azure Functions. Perubahan pada file host.json berlaku untuk semua fungsi dalam aplikasi. Jika Anda memiliki beberapa fungsi yang memerlukan konfigurasi khusus, pertimbangkan untuk memindahkannya ke aplikasi fungsinya sendiri.

Semua fungsi dalam proyek lokal Anda digunakan bersama-sama sebagai sekumpulan file ke aplikasi fungsi Anda di Azure. Anda mungkin perlu menerapkan fungsi individual secara terpisah atau menggunakan fitur seperti slot penyebaran untuk beberapa fungsi dan bukan fungsi lainnya. Dalam kasus seperti itu, Anda harus menerapkan fungsi-fungsi ini (dalam proyek kode terpisah) ke aplikasi fungsi yang berbeda

Menata fungsi menurut hak istimewa

String koneksi dan kredensial lain yang disimpan dalam pengaturan aplikasi memberikan sekumpulan izin yang sama di sumber daya terkait pada semua fungsi dalam aplikasi fungsi. Pertimbangkan untuk mengurangi jumlah fungsi dengan akses ke kredensial tertentu dengan memindahkan fungsi yang tidak menggunakan kredensial tersebut ke aplikasi fungsi terpisah. Anda selalu dapat menggunakan teknik seperti penautan fungsi untuk meneruskan data antar fungsi di berbagai aplikasi fungsi.

Praktik skalabilitas terbaik

Ada sejumlah faktor yang memengaruhi bagaimana instans skala aplikasi fungsi Anda. Rincian disediakan dalam dokumentasi untuk penskalaan fungsi. Berikut ini adalah beberapa praktik terbaik untuk memastikan skalabilitas optimal aplikasi fungsi.

Berbagi dan mengelola koneksi

Gunakan kembali sambungan ke sumber daya eksternal bila memungkinkan. Lihat cara mengelola sambungan di Azure Functions.

Hindari berbagi akun penyimpanan

Saat membuat aplikasi fungsi, Anda harus mengaitkannya dengan akun penyimpanan. Koneksi akun penyimpanan dipertahankan dalam pengaturan aplikasi AzureWebJobsStorage.

Untuk memaksimalkan kinerja, gunakan akun penyimpanan terpisah untuk setiap aplikasi fungsi. Ini sangat penting ketika Anda memiliki fungsi Durable Functions atau Event Hub yang dipicu, yang keduanya menghasilkan volume transaksi penyimpanan yang tinggi. Saat logika aplikasi Anda berinteraksi dengan Azure Storage, baik secara langsung (menggunakan SDK Penyimpanan) atau melalui salah satu pengikatan penyimpanan, Anda harus menggunakan akun penyimpanan khusus. Misalnya, jika Anda memiliki fungsi yang dipicu Event Hub yang menulis beberapa data ke penyimpanan blob, gunakan dua akun penyimpanan—satu untuk aplikasi fungsi dan satu lagi untuk blob yang disimpan oleh fungsi.

Jangan mencampur kode uji dan produksi dalam aplikasi fungsi yang sama

Fungsi dalam aplikasi fungsi sumber daya bersama. Misalnya, memori dibagikan. Jika Anda menggunakan aplikasi fungsi dalam produksi, jangan tambahkan fungsi dan sumber daya terkait pengujian ke dalamnya. Ini dapat menyebabkan biaya tambahan yang tidak terduga selama eksekusi kode produksi.

Berhati-hatilah dengan apa yang Anda muat di aplikasi fungsi produksi Anda. Memori rata-rata di setiap fungsi dalam aplikasi.

Jika Anda memiliki perakitan bersama yang direferensikan dalam beberapa fungsi .NET, masukkan ke dalam folder bersama yang umum. Jika tidak, Anda dapat secara tidak sengaja menyebarkan beberapa versi biner yang sama yang berperilaku berbeda di antara fungsi.

Jangan gunakan pencatatan verbose dalam kode produksi, yang memiliki dampak kinerja negatif.

Gunakan kode asinkron tetapi hindari memblokir panggilan

Pemrograman asinkron adalah praktik terbaik yang direkomendasikan, terutama ketika memblokir operasi I / O terlibat.

Di C#, selalu hindari mereferensikan properti Result atau metode pemanggilan Wait pada sebuah instans Task. Pendekatan ini dapat menyebabkan kelelahan benang.

Tip

Jika Anda berencana untuk menggunakan pengikatan HTTP atau WebHook, rencanakan untuk menghindari kekurangan port yang dapat disebabkan oleh pembuatan objek yang tidak tepat dari HttpClient. Untuk informasi selengkapnya, lihat Cara mengelola koneksi di Azure Functions.

Gunakan beberapa proses pekerja

Secara default, instans host apa pun untuk Fungsi menggunakan satu proses pekerja. Untuk meningkatkan kinerja, terutama dengan runtime berulir tunggal seperti Python, gunakan FUNCTIONS_WORKER_PROCESS_COUNT untuk meningkatkan jumlah proses pekerja per host (hingga 10). Azure Functions kemudian mencoba mendistribusikan permintaan fungsi simultan secara merata ke seluruh pekerja.

FUNCTIONS_WORKER_PROCESS_COUNT berlaku untuk setiap host yang dibuat Functions saat menskalakan aplikasi Anda untuk memenuhi permintaan.

Menerima pesan dalam batch bila memungkinkan

Beberapa pemicu seperti Hub Peristiwa memungkinkan menerima kumpulan pesan pada satu pemanggilan. Pesan batching memiliki kinerja yang jauh lebih baik. Anda dapat mengonfigurasi ukuran batch maks dalam host.json file seperti yang dirinci dalam dokumentasi referensi host.json

Untuk fungsi C#, Anda dapat mengubah tipe menjadi array yang sangat diketik. Misalnya, EventData sensorEvent alih-alih tanda tangan metode bisa EventData[] sensorEvent. Untuk bahasa lain, Anda harus secara eksplisit mengatur properti kardinalitas di tempat Anda untuk function.jsonmany mengaktifkan batching seperti yang ditunjukkan di sini.

Mengonfigurasi perilaku host untuk menangani konkurensi dengan lebih baik

File host.json di aplikasi fungsi memungkinkan konfigurasi runtime host dan perilaku pemicu. Selain perilaku batching, Anda dapat mengelola konkurensi untuk sejumlah pemicu. Seringkali menyesuaikan nilai dalam opsi ini dapat membantu setiap instans menskalakan dengan tepat untuk tuntutan fungsi yang dipanggil.

Pengaturan dalam host.jsfile berlaku di semua fungsi dalam aplikasi, dalam satu instans fungsi. Misalnya, jika Anda memiliki aplikasi fungsi dengan dua fungsi HTTP maxConcurrentRequests dan permintaan yang diatur ke 25, permintaan ke pemicu HTTP akan dihitung terhadap 25 permintaan bersamaan. Ketika aplikasi fungsi tersebut diskalakan menjadi 10 instans, sepuluh fungsi secara efektif memungkinkan 250 permintaan bersamaan (10 instans * 25 permintaan bersamaan per instans).

Opsi konfigurasi host lainnya ditemukan di artikel konfigurasi host.json.

Langkah berikutnya

Untuk informasi selengkapnya, lihat sumber berikut ini: