Penskalakan berbasis target
Penskalaan berbasis target menyediakan model penskalaan yang cepat dan intuitif untuk pelanggan dan saat ini didukung untuk ekstensi pengikatan ini:
- Apache Kafka
- Azure Cosmos DB
- Azure Event Hubs
- Azure Queue Storage
- Azure Bus Layanan (antrean dan topik)
Penskalaan berbasis target menggantikan model penskalaan tambahan Azure Functions sebelumnya sebagai default untuk jenis ekstensi ini. Penskalaan inkremental ditambahkan atau dihapus maksimal satu pekerja pada setiap tingkat instans baru, dengan keputusan kompleks kapan harus menskalakan. Sebaliknya, penskalaan berbasis target memungkinkan peningkatan empat instans sekaligus, dan keputusan penskalaan didasarkan pada persamaan berbasis target sederhana:
Dalam persamaan ini, panjang sumber peristiwa mengacu pada jumlah peristiwa yang harus diproses. Eksekusi target default per nilai instans berasal dari SDK yang digunakan oleh ekstensi Azure Functions. Anda tidak perlu membuat perubahan apa pun agar penskalaan berbasis target berfungsi.
Pertimbangan
Pertimbangan berikut berlaku saat menggunakan penskalaan berbasis target:
- Penskalaan berbasis target diaktifkan secara default untuk aplikasi fungsi pada paket Konsumsi, paket Konsumsi Flex, dan paket Elastic Premium. Penskalakan berbasis peristiwa tidak didukung saat berjalan pada paket Khusus (App Service).
- Penskalaan berbasis target diaktifkan secara default dimulai dengan runtime Functions versi 4.19.0.
- Saat Anda menggunakan penskalakan berbasis target, batas skala masih dihormati. Untuk informasi selengkapnya, lihat Membatasi peluasan skala.
- Untuk mencapai penskalakan yang paling akurat berdasarkan metrik, gunakan hanya satu fungsi yang dipicu berbasis target per aplikasi fungsi. Anda juga harus mempertimbangkan untuk berjalan dalam paket Konsumsi Flex, yang menawarkan penskalakan per fungsi.
- Saat beberapa fungsi dalam aplikasi fungsi yang sama semua meminta untuk meluaskan skala pada saat yang sama, jumlah di seluruh fungsi tersebut digunakan untuk menentukan perubahan dalam instans yang diinginkan. Fungsi yang meminta untuk menskalakan fungsi penimpaan yang meminta untuk menskalakan.
- Ketika ada permintaan penyempurnaan skala tanpa permintaan peluasan skala, nilai skala maksimum akan digunakan.
Memilih keluar
Penskalaan berbasis target diaktifkan secara default untuk aplikasi fungsi yang dihosting pada paket Konsumsi atau pada paket Premium. Untuk menonaktifkan penskalaan berbasis target dan kembali ke penskalaan bertahap, tambahkan pengaturan aplikasi berikut ke aplikasi fungsi Anda:
Pengaturan Aplikasi | Nilai |
---|---|
TARGET_BASED_SCALING_ENABLED |
0 |
Menyesuaikan penskalaan berbasis target
Anda dapat membuat perilaku penskalaan lebih atau kurang agresif berdasarkan beban kerja aplikasi Anda dengan menyesuaikan eksekusi target per instans. Setiap ekstensi memiliki pengaturan berbeda yang dapat Anda gunakan untuk mengatur eksekusi target per instans.
Tabel ini meringkas host.json
nilai yang digunakan untuk eksekusi target per nilai instans dan defaultnya:
Ekstensi | nilai host.json | Nilai Default |
---|---|---|
Azure Event Hubs (Ekstensi v5.x+) | extensions.eventHubs.maxEventBatchSize | 100* |
Event Hubs (Extension v3.x+) | extensions.eventHubs.eventProcessorOptions.maxBatchSize | 10 |
Azure Event Hubs (jika ditentukan) | extensions.eventHubs.targetUnprocessedEventThreshold | n/a |
Bus Layanan (Ekstensi v5.x+, Pengiriman Tunggal) | extensions.serviceBus.maxConcurrentCalls | 16 |
Bus Layanan (Ekstensi v5.x+, Sesi Pengiriman Tunggal Berbasis) | extensions.serviceBus.maxConcurrentSessions | 8 |
Bus Layanan (Ekstensi v5.x+, Pemrosesan Batch) | extensions.serviceBus.maxMessageBatchSize | 1000 |
Bus Layanan (Functions v2.x+, Single Dispatch) | extensions.serviceBus.messageHandlerOptions.maxConcurrentCalls | 16 |
Bus Layanan (Functions v2.x+, Single Dispatch Sessions Based) | extensions.serviceBus.sessionHandlerOptions.maxConcurrentSessions | 2000 |
Bus Layanan (Functions v2.x+, Batch Processing) | extensions.serviceBus.batchOptions.maxMessageCount | 1000 |
Antrean Penyimpanan | extensions.queues.batchSize | 16 |
* Default maxEventBatchSize
berubah dalam v6.0.0 dari Microsoft.Azure.WebJobs.Extensions.EventHubs
paket. Dalam versi sebelumnya, nilai ini adalah 10.
Untuk beberapa ekstensi pengikatan, eksekusi target per instans diatur menggunakan atribut fungsi:
Ekstensi | Pengaturan pemicu fungsi | Nilai Default |
---|---|---|
Apache Kafka | lagThreshold |
1000 |
Azure Cosmos DB | maxItemsPerInvocation |
100 |
Untuk mempelajari selengkapnya, lihat contoh konfigurasi untuk ekstensi yang didukung.
Paket premium dengan pemantauan skala runtime diaktifkan
Saat pemantauan skala runtime diaktifkan, ekstensi itu sendiri menangani penskalakan dinamis. Ini karena pengontrol skala tidak memiliki akses ke layanan yang diamankan oleh jaringan virtual. Setelah mengaktifkan pemantauan skala runtime, Anda harus meningkatkan paket ekstensi ke versi minimum ini untuk membuka kunci fungsionalitas penskalakan berbasis target tambahan:
Nama Ekstensi | Versi Minimum yang Diperlukan |
---|---|
Apache Kafka | 3.9.0 |
Azure Cosmos DB | 4.1.0 |
Event Hubs | 5.2.0 |
Service Bus | 5.9.0 |
Antrean Penyimpanan | 5.1.0 |
Dukungan konkurensi dinamis
Penskalaan berbasis target memperkenalkan penskalaan yang lebih cepat, dan menggunakan default untuk eksekusi target per instans. Saat menggunakan Bus Layanan, Antrean Penyimpanan, atau Kafka, Anda juga dapat mengaktifkan konkurensi dinamis. Dalam konfigurasi ini, eksekusi target per nilai instans ditentukan secara otomatis oleh fitur konkurensi dinamis. Ini dimulai dengan konkurensi terbatas dan mengidentifikasi pengaturan terbaik dari waktu ke waktu.
Ekstensi yang didukung
Cara Anda mengonfigurasi penskalakan berbasis target dalam file host.json bergantung pada jenis ekstensi tertentu. Bagian ini menyediakan detail konfigurasi untuk ekstensi yang saat ini mendukung penskalaan berbasis target.
Antrean dan topik Azure Service Bus
Ekstensi Bus Layanan mendukung tiga model eksekusi, yang ditentukan oleh IsBatched
atribut dan IsSessionsEnabled
pemicu Bus Layanan Anda. Nilai default untuk IsBatched
dan IsSessionsEnabled
adalah false
.
Model Eksekusi | IsBatched | isSessionsEnabled | Pengaturan Digunakan untuk eksekusi target per instans |
---|---|---|---|
Pemrosesan pengiriman tunggal | salah | salah | maxConcurrentCalls |
Pemrosesan pengiriman tunggal (berbasis sesi) | salah | benar | maxConcurrentSessions |
Pemrosesan batch | benar | salah | maxMessageBatchSize atau maxMessageCount |
Catatan
Efisiensi skala: Untuk ekstensi Bus Layanan, gunakan Kelola hak pada sumber daya untuk penskalaan yang paling efisien. Dengan penskalaan hak Dengar kembali ke skala inkremental karena antrean atau panjang topik tidak dapat digunakan untuk menginformasikan keputusan penskalaan. Untuk mempelajari selengkapnya tentang menetapkan hak dalam kebijakan akses Bus Layanan, lihat Kebijakan Otorisasi Akses Bersama.
Pemrosesan pengiriman tunggal
Dalam model ini, setiap pemanggilan fungsi Anda memproses satu pesan. Pengaturan maxConcurrentCalls
mengatur eksekusi target per instans. Pengaturan spesifik tergantung pada versi ekstensi Bus Layanan.
host.json
Ubah pengaturan maxConcurrentCalls
, seperti dalam contoh berikut:
{
"version": "2.0",
"extensions": {
"serviceBus": {
"maxConcurrentCalls": 16
}
}
}
Pemrosesan pengiriman tunggal (berbasis sesi)
Dalam model ini, setiap pemanggilan fungsi Anda memproses satu pesan. Namun, tergantung pada jumlah sesi aktif untuk topik atau antrean Bus Layanan Anda, setiap instans menyewa satu atau beberapa sesi. Pengaturan spesifik tergantung pada versi ekstensi Bus Layanan.
host.json
Ubah pengaturan maxConcurrentSessions
untuk mengatur eksekusi target per instans, seperti dalam contoh berikut:
{
"version": "2.0",
"extensions": {
"serviceBus": {
"maxConcurrentSessions": 8
}
}
}
Pemrosesan batch
Dalam model ini, setiap pemanggilan fungsi Anda memproses batch pesan. Pengaturan spesifik tergantung pada versi ekstensi Bus Layanan.
host.json
Ubah pengaturan maxMessageBatchSize
untuk mengatur eksekusi target per instans, seperti dalam contoh berikut:
{
"version": "2.0",
"extensions": {
"serviceBus": {
"maxMessageBatchSize": 1000
}
}
}
Event Hubs
Untuk Azure Event Hubs, Azure Functions menskalakan berdasarkan jumlah peristiwa yang tidak diolah yang didistribusikan di semua partisi di hub peristiwa. Secara default, atribut yang host.json
digunakan untuk eksekusi target per instans adalah maxEventBatchSize
dan maxBatchSize
. Namun, jika Anda memilih untuk menyempurnakan penskalaan berbasis target, Anda dapat menentukan parameter targetUnprocessedEventThreshold
terpisah yang mengambil alih untuk mengatur eksekusi target per instans tanpa mengubah pengaturan batch. Jika targetUnprocessedEventThreshold
disetel, jumlah peristiwa total yang tidak diolah dibagi dengan nilai ini untuk menentukan jumlah instans, yang kemudian dibulatkan ke jumlah instans pekerja yang membuat distribusi partisi seimbang.
Catatan
Karena Azure Event Hubs adalah beban kerja yang dipartisi, jumlah instans target untuk Azure Event Hubs dibatasi oleh jumlah partisi di hub peristiwa Anda.
Pengaturan tertentu bergantung pada versi ekstensi Azure Event Hubs.
host.json
Ubah pengaturan maxEventBatchSize
untuk mengatur eksekusi target per instans, seperti dalam contoh berikut:
{
"version": "2.0",
"extensions": {
"eventHubs": {
"maxEventBatchSize" : 100
}
}
}
Ketika didefinisikan dalam host.json
, digunakan sebagai eksekusi target per instans, bukan maxEventBatchSize
, seperti targetUnprocessedEventThreshold
dalam contoh berikut:
{
"version": "2.0",
"extensions": {
"eventHubs": {
"targetUnprocessedEventThreshold": 153
}
}
}
Antrean Penyimpanan
Untuk v2.x+ ekstensi Penyimpanan, ubah host.json
pengaturan batchSize
untuk mengatur eksekusi target per instans:
{
"version": "2.0",
"extensions": {
"queues": {
"batchSize": 16
}
}
}
Catatan
Efisiensi skala: Untuk ekstensi antrean penyimpanan, pesan dengan visibilityTimeout masih dihitung dalam panjang sumber peristiwa oleh API Antrean Penyimpanan. Ini dapat menyebabkan penskalaan berlebihan aplikasi fungsi Anda. Pertimbangkan untuk menggunakan antrean Bus Layanan mengantre pesan terjadwal, membatasi peluasan skala, atau tidak menggunakan visibilityTimeout untuk solusi Anda.
Azure Cosmos DB
Azure Cosmos DB menggunakan atribut tingkat fungsi, MaxItemsPerInvocation
. Cara Anda mengatur atribut tingkat fungsi ini bergantung pada bahasa fungsi Anda.
Untuk fungsi C# yang dikompilasi, atur MaxItemsPerInvocation
dalam definisi pemicu Anda, seperti yang ditunjukkan dalam contoh berikut untuk fungsi C# dalam proses:
namespace CosmosDBSamplesV2
{
public static class CosmosTrigger
{
[FunctionName("CosmosTrigger")]
public static void Run([CosmosDBTrigger(
databaseName: "ToDoItems",
collectionName: "Items",
MaxItemsPerInvocation: 100,
ConnectionStringSetting = "CosmosDBConnection",
LeaseCollectionName = "leases",
CreateLeaseCollectionIfNotExists = true)]IReadOnlyList<Document> documents,
ILogger log)
{
if (documents != null && documents.Count > 0)
{
log.LogInformation($"Documents modified: {documents.Count}");
log.LogInformation($"First document Id: {documents[0].Id}");
}
}
}
}
Catatan
Karena Azure Cosmos DB adalah beban kerja yang dipartisi, jumlah instans target untuk database dibatasi oleh jumlah partisi fisik dalam kontainer Anda. Untuk mempelajari selengkapnya tentang penskalaan Azure Cosmos DB, lihat partisi fisik dan kepemilikan sewa.
Apache Kafka
Ekstensi Apache Kafka menggunakan atribut tingkat fungsi, LagThreshold
. Untuk Kafka, jumlah instans yang diinginkan dihitung berdasarkan total jeda konsumen yang dibagi dengan LagThreshold
pengaturan. Untuk jeda tertentu, mengurangi ambang jeda meningkatkan jumlah instans yang diinginkan.
Cara Anda mengatur atribut tingkat fungsi ini bergantung pada bahasa fungsi Anda. Contoh ini mengatur ambang batas ke 100
.
Untuk fungsi C# yang dikompilasi, atur LagThreshold
dalam definisi pemicu Anda, seperti yang ditunjukkan dalam contoh berikut untuk fungsi C# dalam proses untuk pemicu Kafka Event Hubs:
[FunctionName("KafkaTrigger")]
public static void Run(
[KafkaTrigger("BrokerList",
"topic",
Username = "$ConnectionString",
Password = "%EventHubConnectionString%",
Protocol = BrokerProtocol.SaslSsl,
AuthenticationMode = BrokerAuthenticationMode.Plain,
ConsumerGroup = "$Default",
LagThreshold = 100)] KafkaEventData<string> kevent, ILogger log)
{
log.LogInformation($"C# Kafka trigger function processed a message: {kevent.Value}");
}
Langkah berikutnya
Untuk mempelajari selengkapnya, lihat artikel berikut ini: