Penskalakan berbasis target

Penskalaan berbasis target menyediakan model penskalaan yang cepat dan intuitif untuk pelanggan dan saat ini didukung untuk ekstensi pengikatan ini:

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:

Ilustrasi persamaan: instans yang diinginkan = panjang sumber peristiwa/eksekusi target per instans.

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: