Bagikan melalui


Konkurensi di Azure Functions

Artikel ini menjelaskan perilaku konkurensi pemicu berbasis peristiwa di Azure Functions. Ini juga membandingkan model konkurensi statis dan dinamis.

Penting

Paket Konsumsi Flex saat ini dalam pratinjau.

Di Functions, Anda dapat memiliki beberapa proses eksekusi fungsi tertentu yang berjalan bersamaan pada satu instans komputasi. Misalnya, pertimbangkan kasus di mana Anda memiliki tiga fungsi berbeda di aplikasi fungsi Anda yang diskalakan ke beberapa instans untuk menangani peningkatan beban. Dalam skenario ini, setiap fungsi dijalankan sebagai respons terhadap pemanggilan individu di ketiga instans, dan instans tertentu dapat menangani beberapa pemanggilan dengan jenis yang sama. Perlu diingat bahwa eksekusi fungsi pada satu instans memiliki memori, CPU, dan sumber daya koneksi yang sama. Karena beberapa eksekusi fungsi dapat berjalan pada setiap instans secara bersamaan, setiap fungsi harus memiliki cara untuk mengelola jumlah eksekusi bersamaan.

Saat aplikasi Anda dihosting dalam rencana skala dinamis (Konsumsi, Konsumsi Flex, atau Premium), host menskalakan jumlah instans aplikasi fungsi ke atas atau ke bawah berdasarkan jumlah peristiwa masuk. Untuk mempelajari lebih lanjut, lihat Penskalakan Berbasis Peristiwa. Saat menghosting fungsi dalam paket Khusus (App Service), Anda harus mengonfigurasi instans anda secara manual atau menyiapkan skema skala otomatis.

Keputusan skala ini juga terpengaruh langsung oleh konkurensi eksekusi pada instans tertentu. Saat aplikasi dalam paket skala dinamis mencapai batas konkurensi, aplikasi mungkin perlu menskalakan untuk mengikuti permintaan yang masuk.

Functions menyediakan dua cara utama untuk mengelola konkurensi:

  • Konkurensi statis: Anda dapat mengonfigurasi batas tingkat host pada konkurensi, yang khusus untuk pemicu individual. Ini adalah perilaku konkurensi default untuk Functions.

  • Konkurensi dinamis: Untuk jenis pemicu tertentu, host Functions dapat secara otomatis menentukan tingkat konkurensi terbaik untuk pemicu tersebut di aplikasi Anda. Anda harus ikut serta dalam model konkurensi ini.

Konkurensi statik

Secara default, sebagian besar pemicu mendukung model konfigurasi statis tingkat host. Dalam model ini, setiap jenis pemicu memiliki batas konkurensi per instans. Namun, untuk sebagian besar pemicu, Anda juga dapat meminta konkurensi per instans tertentu untuk jenis pemicu tersebut. Misalnya, pemicu Bus Layanan menyediakan layanan MaxConcurrentCalls dan MaxConcurrentSessions dalam file host.json. Pengaturan ini bersama-sama mengontrol jumlah maksimum pesan yang diproses setiap fungsi secara bersamaan di setiap instans. Jenis pemicu lainnya memiliki mekanisme bawaan untuk pemanggilan penyeimbangan beban di seluruh instans. Misalnya, Event Hubs dan Azure Cosmos DB keduanya menggunakan skema berbasis partisi.

Untuk jenis pemicu yang mendukung konfigurasi konkurensi, pengaturan yang Anda pilih diterapkan ke semua instans yang sedang berjalan. Ini memungkinkan Anda mengontrol konkurensi maksimum untuk fungsi Anda pada setiap instans. Misalnya, ketika fungsi Anda CPU atau intensif sumber daya, Anda dapat memilih untuk membatasi konkurensi untuk menjaga instans tetap sehat dan mengandalkan penskalaan untuk menangani peningkatan beban. Demikian pula, ketika fungsi Anda membuat permintaan ke layanan hilir yang sedang dibatasi, Anda juga harus mempertimbangkan untuk membatasi konkurensi untuk menghindari kelebihan beban layanan hilir.

Konkurensi pemicu HTTP

Hanya berlaku untuk paket Konsumsi Flex (pratinjau)

Paket Konsumsi Flex menskalakan semua fungsi pemicu HTTP bersama-sama sebagai grup. Untuk informasi selengkapnya, lihat Penskalaan per fungsi. Tabel berikut menunjukkan pengaturan konkurensi default untuk pemicu HTTP pada instans tertentu, berdasarkan ukuran memori instans yang dikonfigurasi.

Ukuran instans (MB) Konkurensi default*
2048 16
4096 32

*Untuk aplikasi Python, konkurensi pemicu HTTP default untuk semua ukuran instans adalah 1.

Default ini harus berfungsi dengan baik untuk sebagian besar kasus, dan Anda mulai dengannya. Pertimbangkan bahwa pada sejumlah permintaan HTTP tertentu, meningkatkan nilai konkurensi HTTP mengurangi jumlah instans yang diperlukan untuk menangani permintaan HTTP. Demikian juga mengurangi nilai konkurensi HTTP memerlukan lebih banyak instans untuk menangani beban yang sama.

Jika Anda perlu menyempurnakan konkurensi HTTP, Anda dapat melakukan ini dengan menggunakan Azure CLI. Untuk informasi selengkapnya, lihat Mengatur batas konkurensi HTTP.

Nilai konkurensi default dalam tabel sebelumnya hanya berlaku saat Anda belum mengatur pengaturan konkurensi HTTP Anda sendiri. Saat Anda belum secara eksplisit mengatur pengaturan konkurensi HTTP, konkurensi default meningkat seperti yang ditunjukkan dalam tabel saat Anda mengubah ukuran instans. Setelah Anda secara khusus menetapkan nilai konkurensi HTTP, nilai tersebut dipertahankan meskipun ada perubahan dalam ukuran instans.

Menentukan konkurensi statis yang optimal

Meskipun konfigurasi konkurensi statis memberi Anda kontrol atas perilaku pemicu tertentu, seperti pembatasan fungsi Anda, mungkin sulit untuk menentukan nilai optimal untuk pengaturan ini. Umumnya, Anda harus sampai pada nilai yang dapat diterima oleh proses berulang pengujian beban. Bahkan setelah Anda menentukan sekumpulan nilai yang berfungsi untuk profil beban tertentu, jumlah peristiwa yang tiba dari layanan terhubung Anda dapat berubah dari hari ke hari. Variabilitas ini berarti aplikasi Anda mungkin sering berjalan dengan nilai suboptimal. Misalnya, aplikasi fungsi Anda dapat memproses payload pesan yang sangat dibutuhkan di akhir pekan, yang mengharuskan Anda mengurangi batas kecepatan konkurensi. Namun, selama sisa minggu ini, payload pesan lebih sederhana, yang berarti Anda dapat menggunakan tingkat konkurensi yang lebih tinggi sepanjang minggu.

Idealnya, kami menginginkan sistem untuk memungkinkan instans memproses pekerjaan sebanyak mungkin sekaligus menjaga setiap instans tetap sehat dan latensi tetap rendah, yang merupakan tujuan dibuatnya konkurensi dinamis.

Konkurensi dinamis

Functions kini menyediakan model konkurensi dinamis yang mempermudah konfigurasi konkurensi untuk semua aplikasi fungsi yang berjalan dalam paket yang sama.

Catatan

Konkurensi dinamis saat ini hanya didukung untuk pemicu Azure Blob, Azure Queue, dan Azure Service Bus, serta mengharuskan Anda untuk menggunakan versi yang tercantum di bagian dukungan ekstensi di bawah ini.

Keuntungan

Menggunakan konkurensi dinamis memberikan manfaat berikut:

  • Konfigurasi yang disederhanakan: Anda tidak lagi harus menentukan pengaturan konkurensi per pemicu secara manual. Sistem mempelajari nilai optimal untuk beban kerja Anda dari waktu ke waktu.
  • Penyesuaian dinamis: Konkurensi disesuaikan naik atau turun secara dinamis secara real-time, yang memungkinkan sistem beradaptasi dengan perubahan pola beban dari waktu ke waktu.
  • Perlindungan kesehatan instans: Runtime membatasi konkurensi ke tingkat yang dapat ditangani instans aplikasi fungsi dengan mudah. Ini melindungi aplikasi dari muatan berlebih dengan sendirinya dengan mengambil lebih banyak pekerjaan daripada yang seharusnya.
  • Peningkatan throughput: Throughput keseluruhan ditingkatkan karena instans individu tidak menarik lebih banyak pekerjaan daripada yang dapat diproses dengan cepat. Hal ini memungkinkan pekerjaan diseimbangkan bebannya dengan lebih efektif di seluruh instans. Untuk fungsi yang dapat menangani beban yang lebih tinggi, throughput yang lebih tinggi dapat diperoleh dengan meningkatkan konkurensi ke nilai di atas konfigurasi default.

Konfigurasi konkurensi dinamis

Konkurensi dinamis dapat diaktifkan di tingkat host dalam file host.json. Saat diaktifkan, tingkat konkurensi ekstensi pengikatan apa pun yang mendukung fitur ini disesuaikan secara otomatis sesuai kebutuhan. Dalam kasus ini, pengaturan konkurensi dinamis mengambil alih pengaturan konkurensi yang dikonfigurasi secara manual.

Secara default, konkurensi dinamis dinonaktifkan. Dengan konkurensi dinamis diaktifkan, konkurensi dimulai pada nilai 1 untuk setiap fungsi, dan disesuaikan hingga nilai optimal, yang ditentukan oleh host.

Anda dapat mengaktifkan konkurensi dinamis di aplikasi fungsi dengan menambahkan pengaturan berikut di file host.json:

    { 
        "version": "2.0", 
        "concurrency": { 
            "dynamicConcurrencyEnabled": true, 
            "snapshotPersistenceEnabled": true 
        } 
    } 

Jika SnapshotPersistenceEnabled adalah true, yang merupakan pengaturan default, nilai konkurensi yang dipelajari akan dipertahankan secara berkala untuk penyimpanan sehingga intans dimulai dari nilai-nilai tersebut, bukan dari mulai dari 1 dan harus mengulang pembelajaran.

Pengelola konkurensi

Di luar tampilan publik, saat konkurensi dinamis diaktifkan, terdapat proses pengelola konkurensi yang berjalan di latar belakang. Pengelola ini terus memantau metrik kesehatan instans, seperti penggunaan CPU dan alur, dan mengubah pembatasan sesuai kebutuhan. Jika satu atau beberapa pembatasan diaktifkan, konkurensi fungsi disesuaikan ke bawah sampai host sehat kembali. Jika pembatasan dinonaktifkan, konkurensi dapat ditingkatkan. Berbagai heuristik digunakan untuk menyesuaikan konkurensi ke atas atau ke bawah secara cerdas sesuai kebutuhan berdasarkan pembatasan ini. Seiring waktu, konkurensi untuk setiap fungsi distabilkan pada tingkat tertentu.

Tingkat konkurensi dikelola untuk setiap fungsi individu. Dengan demikian, sistem menyeimbangkan antara fungsi padat sumber daya yang membutuhkan konkurensi tingkat rendah dan fungsi yang lebih ringan yang dapat menangani konkurensi yang lebih tinggi. Keseimbangan konkurensi untuk setiap fungsi membantu menjaga kesehatan instans aplikasi fungsi secara menyeluruh.

Jika konkurensi dinamis diaktifkan, Anda akan melihat keputusan konkurensi dinamis di log Anda. Misalnya, Anda akan melihat log saat berbagai pembatasan diaktifkan, dan setiap kali konkurensi disesuaikan ke atas atau ke bawah untuk setiap fungsi. Log ini ditulis di bagian kategori log Host.Concurrency dalam tabel jejak.

Dukungan ekstensi

Konkurensi dinamis diaktifkan untuk aplikasi fungsi di tingkat host, dan ekstensi apa pun yang mendukung konkurensi dinamis berjalan dalam mode tersebut. Konkurensi dinamis membutuhkan kolaborasi antara host dan ekstensi pemicu individu. Hanya versi terdaftar dari ekstensi berikut yang mendukung konkurensi dinamis.

Ekstensi Versi Deskripsi
Antrean Penyimpanan versi 5.x (Ekstensi penyimpanan) Pemicu penyimpanan Azure Queue memiliki loop polling pesannya sendiri. Saat menggunakan konfigurasi statik, konkurensi diatur oleh opsi konfigurasi BatchSize/NewBatchThreshold. Saat menggunakan konkurensi dinamis, nilai konfigurasi tersebut diabaikan. Konkurensi dinamis diintegrasikan ke dalam loop pesan, sehingga jumlah pesan yang diambil per perulangan disesuaikan secara dinamis. Ketika pembatasan diaktifkan (host kelebihan beban), pemrosesan pesan akan dijeda hingga pembatasan dinonaktifkan. Jika pembatasan dinonaktifkan, konkurensi dapat ditingkatkan.
Penyimpanan Blob versi 5.x (Ekstensi penyimpanan) Secara internal, pemicu penyimpanan Azure Blob menggunakan infrastruktur yang sama dengan yang digunakan Azure Queue Trigger. Saat blob baru/yang diperbarui perlu diproses, pesan ditulis ke antrean kontrol yang dikelola platform, dan antrean tersebut diproses menggunakan logika yang sama yang digunakan untuk QueueTrigger. Ketika konkurensi dinamis diaktifkan, konkurensi untuk pemrosesan antrean kontrol tersebut akan dikelola secara dinamis.
Service Bus versi 5.x Pemicu Azure Service Bus saat ini mendukung tiga model eksekusi. Konkurensi dinamis mempengaruhi model eksekusi ini sebagai berikut:

Pemrosesan topik/antrean pengiriman tunggal: Setiap pemanggilan fungsi Anda memproses satu pesan. Saat menggunakan konfigurasi statis, konkurensi diatur oleh MaxConcurrentCalls opsi konfigurasi. Saat menggunakan konkurensi dinamis, nilai konfigurasi ini diabaikan, dan konkurensi disesuaikan secara dinamis.
Pemrosesan topik/antrean pengiriman tunggal berbasis sesi: Setiap pemanggilan fungsi Anda memproses satu pesan. Bergantung pada jumlah sesi aktif untuk topik/antrean Anda, setiap instans menyewa satu atau beberapa sesi. Pesan di setiap sesi diproses secara seri, untuk menjamin pengurutan dalam sesi. Saat konkurensi dinamis tidak digunakan, konkurensi diatur oleh MaxConcurrentSessions pengaturan. Dengan konkurensi dinamis diaktifkan, MaxConcurrentSessions diabaikan dan jumlah sesi yang diproses setiap instans disesuaikan secara dinamis.
Pemrosesan batch: Setiap pemanggilan fungsi Anda memproses batch pesan, yang diatur oleh MaxMessageCount pengaturan. Karena pemanggilan batch bersifat seri, konkurensi untuk fungsi yang dipicu batch Anda selalu satu dan konkurensi dinamis tidak diterapkan.

Langkah berikutnya

Untuk informasi selengkapnya, lihat sumber daya berikut: