Bagikan melalui


Meningkatkan performa dan keandalan Azure Functions

Artikel ini menyediakan panduan untuk meningkatkan performa 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 Anda menggunakan Azure Functions.

Hindari fungsi jangka panjang

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

Fungsi dapat menjadi besar karena banyak dependensi Node.js. Mengimpor dependensi juga dapat menyebabkan peningkatan waktu pemuatan yang mengakibatkan waktu habis yang tak 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 sama dan mengembalikan respons dengan cepat. Misalnya, fungsi pemicu webhook atau HTTP mungkin memerlukan respons pengakuan dalam batas waktu tertentu; adalah umum bagi webhook untuk memerlukan respons segera. Anda dapat meneruskan payload 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, atau proses apa pun, semuanya harus diselesaikan sebelum kode fungsi Anda mengembalikan hasil. Karena Fungsi tidak melacak utas latar belakang ini, penghentian situs dapat terjadi terlepas dari status utas latar belakang, yang dapat menyebabkan perilaku yang tidak diinginkan pada 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, itu mungkin terganggu oleh penonaktifan situs, meninggalkan pekerjaan tersebut dalam kondisi tidak jelas.

Komunikasi lintas fungsi

Durable Functions dan Azure Logic Apps dibangun untuk mengelola transisi status dan komunikasi antara beberapa fungsi.

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

Pesan individual dalam antrean penyimpanan dibatasi ukurannya 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 Bus Layanan berguna jika Anda memerlukan pemfilteran pesan sebelum diproses.

Hub event berguna untuk mendukung komunikasi dengan volume tinggi.

Tulis fungsi agar bersifat stateless

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

Fungsi idempotensi sangat direkomendasikan 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 dapat keluar ketika tidak ada pekerjaan untuk hari tertentu. Juga jika proses sebelumnya gagal diselesaikan, proses berikutnya harus melanjutkan dari titik terakhir. Ini sangat penting untuk pengikatan berbasis pesan yang melakukan percobaan ulang setelah kegagalan. Untuk informasi selengkapnya, lihat Mendesain Azure Functions untuk input yang identik.

Menulis fungsi defensif

Asumsikan fungsi Anda dapat mengalami 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 guna diproses lebih lanjut dalam urutan.

Tergantung pada seberapa kompleks sistem Anda, Anda mungkin mengalami: layanan hilir yang berperilaku buruk, gangguan jaringan, atau kuota tercapai, dll. Semua ini dapat memengaruhi operasi Anda kapan saja. Anda perlu merancang fungsi Anda agar siap menghadapi hal tersebut.

Bagaimana kode Anda bereaksi 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 mungkin menyisipkannya lagi lain kali. Penyisipan ganda ini dapat berdampak serius pada alur kerja Anda, jadi buat fungsi Anda idempotensi.

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 Azure Storage.

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 menjalankan 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.

Mengatur fungsi untuk performa dan penskalaan

Setiap fungsi yang Anda buat memiliki jejak memori. Meskipun dampak ini biasanya kecil, memiliki terlalu banyak fungsi dalam satu aplikasi dapat menyebabkan aplikasi Anda memulai 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 berada dalam satu aplikasi, yang tergantung pada beban kerja tertentu 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 (App Service), 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 tersebut menggunakan jumlah sumber daya memori yang tidak proporsional pada setiap instans tempat aplikasi disebarkan. Karena ini dapat menyebabkan lebih sedikit memori yang tersedia untuk aplikasi lain di setiap instans, Anda mungkin ingin menjalankan aplikasi fungsi dengan memori tinggi seperti ini dalam paket hosting terpisahnya sendiri.

Nota

Saat menggunakan paket Konsumsi, kami sarankan Anda selalu menempatkan setiap aplikasi dalam paketnya sendiri, karena aplikasi 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 di aplikasi fungsi terpisah sehingga mereka mendapatkan set sumber daya mereka sendiri dan mereka menskalakan secara independen satu sama lain.

Mengatur fungsi untuk konfigurasi dan penyebaran

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

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

Menata fungsi menurut hak istimewa

Rangkaian koneksi dan kredensial lain yang disimpan dalam pengaturan aplikasi memberikan semua fungsi dalam aplikasi tersebut serangkaian izin yang sama di sumber daya terkait. 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 terbaik skalabilitas

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

Berbagi dan mengelola koneksi

Gunakan kembali koneksi ke sumber daya eksternal jika memungkinkan. Lihat cara mengelola koneksi 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. Pendekatan ini sangat penting ketika Anda memiliki fungsi yang dipicu Durable Functions atau Event Hubs, 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 oleh hub acara yang menuliskan data ke dalam 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 sebuah aplikasi fungsi berbagi sumber daya. Misalnya, memori digunakan bersama. Jika Anda menggunakan aplikasi fungsi dalam produksi, jangan tambahkan fungsi dan sumber daya terkait pengujian ke dalamnya. Ini dapat menyebabkan overhead yang tidak terduga selama eksekusi kode produksi.

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

Jika Anda memiliki rakitan bersama yang dirujuk dalam beberapa fungsi .NET, letakkan di folder bersama umum. Jika tidak, Anda dapat secara tidak sengaja meng-implementasi beberapa versi biner yang sama yang berperilaku berbeda di antara fungsi.

Jangan gunakan pengelogan verbose dalam kode produksi, yang memiliki dampak performa 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 mereferensi properti Result atau memanggil metode Wait pada instance Task. Pendekatan ini dapat menyebabkan habisnya thread.

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 bawaan, instans host apa pun untuk Functions menggunakan satu proses pekerja. Untuk meningkatkan performa, 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.

Aplikasi 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 Event Hub memungkinkan penerimaan batch pesan pada satu pemanggilan. Pesan batching memiliki performa yang jauh lebih baik. Anda dapat mengonfigurasi ukuran batch maks di dalam file host.json sebagaimana dijelaskan dalam dokumentasi referensihost.json

Untuk fungsi C#, Anda dapat mengubah tipe menjadi array bertipe kuat. Misalnya, alih-alih EventData sensorEvent tanda tangan metode bisa menjadi EventData[] sensorEvent. Untuk bahasa lain, Anda perlu secara eksplisit mengatur properti kardinalitas dalam function.json ke many untuk 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 file host.json berlaku di semua fungsi dalam aplikasi, dalam satu instans fungsi. Misalnya, jika Anda memiliki aplikasi fungsi dengan dua fungsi HTTP dan maxConcurrentRequests permintaan yang diatur ke 25, permintaan ke salah satu pemicu HTTP akan dihitung dalam 25 permintaan bersamaan. Ketika aplikasi fungsi tersebut diskalakan menjadi 10 instans, sepuluh fungsi secara efektif mengizinkan 250 permintaan bersamaan (10 instans * 25 permintaan bersamaan per instans).

Opsi konfigurasi host lainnya ditemukan di artikel konfigurasihost.json.

Langkah selanjutnya

Untuk informasi selengkapnya, lihat sumber daya berikut ini: