Schaalaanpassing op basis van doel

Op doel gebaseerde schaalaanpassing biedt een snel en intuïtief schaalmodel voor klanten en wordt momenteel ondersteund voor de volgende extensies:

Op doel gebaseerde schaalaanpassing vervangt het vorige incrementele schaalmodel van Azure Functions als de standaardwaarde voor deze extensietypen. Incrementeel schalen heeft een maximum van één werkrol toegevoegd of verwijderd bij elke nieuwe instantiesnelheid, met complexe beslissingen voor het schalen van de schaal. Met op doel gebaseerde schaalaanpassing kunt u daarentegen maximaal vier exemplaren tegelijk schalen en is de schaalbeslissing gebaseerd op een eenvoudige vergelijking op basis van een doel:

Illustration of the equation: desired instances = event source length / target executions per instance.

De standaarduitvoeringen per exemplaar zijn afkomstig van de SDK's die worden gebruikt door de Azure Functions-extensies. U hoeft geen wijzigingen aan te brengen voor schaalaanpassing op basis van doel.

Overwegingen

De volgende overwegingen zijn van toepassing bij het gebruik van schaalaanpassing op basis van doel:

  • Schalen op basis van doel is standaard ingeschakeld voor functie-apps in het verbruiksabonnement of voor Premium-abonnementen, maar u kunt zich afmelden. Gebeurtenisgestuurd schalen wordt niet ondersteund bij het uitvoeren van toegewezen (App Service)-abonnementen.
  • Schalen op basis van doel is standaard ingeschakeld voor de runtime van de functie-app 4.19.0 of een latere versie.
  • Wanneer u schaalaanpassing op basis van doel gebruikt, wordt de functionAppScaleLimit site-instelling nog steeds gehonoreerd. Zie Uitschalen van limieten voor meer informatie.
  • Als u de meest nauwkeurige schaal wilt bereiken op basis van metrische gegevens, gebruikt u slechts één op doel gebaseerde geactiveerde functie per functie-app.
  • Wanneer meerdere functies in dezelfde functie-app allemaal tegelijk worden aangevraagd om uit te schalen, wordt een som van deze functies gebruikt om de wijziging in gewenste exemplaren te bepalen. Functies die aanvragen om uit te schalen, overschrijven functies die worden aangevraagd om in te schalen.
  • Wanneer er inschalingsaanvragen zijn zonder uitschaalaanvragen, wordt de maximale schaalwaarde gebruikt.

Afmelden

Schalen op basis van doel is standaard ingeschakeld voor functie-apps die worden gehost in een verbruiksabonnement of in een Premium-abonnement. Als u het schalen op basis van doel wilt uitschakelen en wilt terugvallen op incrementeel schalen, voegt u de volgende app-instelling toe aan uw functie-app:

App-instelling Weergegeven als
TARGET_BASED_SCALING_ENABLED 0

Aanpassen van schaalaanpassing op basis van doel

U kunt het schaalgedrag meer of minder agressief maken op basis van de workload van uw app door doeluitvoeringen per exemplaar aan te passen. Elke extensie heeft verschillende instellingen die u kunt gebruiken om doeluitvoeringen per exemplaar in te stellen.

Deze tabel bevat een overzicht van de host.json waarden die worden gebruikt voor de doeluitvoeringen per exemplaar en de standaardwaarden:

Toestel waarden voor host.json Standaardwaarde
Event Hubs (extensie v5.x+) extensions.eventHubs.maxEventBatchSize 100*
Event Hubs (extension v3.x+) extensions.eventHubs.eventProcessorOptions.maxBatchSize 10
Event Hubs (indien gedefinieerd) extensions.eventHubs.targetUnprocessedEventThreshold N.v.t.
Service Bus (Extension v5.x+, Single Dispatch) extensions.serviceBus.maxConcurrentCalls 16
Service Bus (Extension v5.x+, Single Dispatch Sessions Based) extensions.serviceBus.maxConcurrentSessions 8
Service Bus (Extension v5.x+, Batch Processing) extensions.serviceBus.maxMessageBatchSize 1000
Service Bus (Functions v2.x+, Single Dispatch) extensions.serviceBus.messageHandlerOptions.maxConcurrentCalls 16
Service Bus (Functions v2.x+, op basis van enkelvoudige verzendingssessies) extensions.serviceBus.sessionHandlerOptions.maxConcurrentSessions 2000
Service Bus (Functions v2.x+, Batch Processing) extensions.serviceBus.batchOptions.maxMessageCount 1000
Opslagwachtrij extensions.queues.batchSize 16

* De standaardwaarde maxEventBatchSize is gewijzigd in v6.0.0 van het Microsoft.Azure.WebJobs.Extensions.EventHubs pakket. In eerdere versies was deze waarde 10.

Voor sommige bindingsextensies worden doeluitvoeringen per exemplaar ingesteld met behulp van een functiekenmerk:

Toestel Instelling voor functietrigger Standaardwaarde
Apache Kafka lagThreshold 1000
Azure Cosmos DB maxItemsPerInvocation 100

Zie de voorbeeldconfiguraties voor de ondersteunde extensies voor meer informatie.

Premium-abonnement waarbij bewaking van runtimeschaal is ingeschakeld

Wanneer bewaking van runtimeschaal is ingeschakeld, verwerken de extensies zelf dynamisch schalen. Dit komt doordat de schaalcontroller geen toegang heeft tot services die worden beveiligd door een virtueel netwerk. Nadat u runtimeschaalbewaking hebt ingeschakeld, moet u uw extensiepakketten upgraden naar deze minimale versies om de extra schaalfunctionaliteit op basis van doel te ontgrendelen:

Extensienaam Minimale versie vereist
Apache Kafka 3.9.0
Azure Cosmos DB 4.1.0
Event Hubs 5.2.0
Service Bus 5.9.0
Opslagwachtrij 5.1.0

Ondersteuning voor dynamische gelijktijdigheid

Schaalaanpassing op basis van doel introduceert snellere schaalaanpassing en maakt gebruik van standaardwaarden voor doeluitvoeringen per exemplaar. Wanneer u Service Bus, Opslagwachtrijen of Kafka gebruikt, kunt u ook dynamische gelijktijdigheid inschakelen. In deze configuratie worden de doeluitvoeringen per exemplaarwaarde automatisch bepaald door de functie voor dynamische gelijktijdigheid. Het begint met beperkte gelijktijdigheid en identificeert de beste instelling in de loop van de tijd.

Ondersteunde extensies

De manier waarop u schaalaanpassing op basis van doel configureert in uw host.json-bestand, is afhankelijk van het specifieke extensietype. Deze sectie bevat de configuratiedetails voor de extensies die momenteel ondersteuning bieden voor schaalaanpassing op basis van doel.

Service Bus-wachtrijen en -onderwerpen

De Service Bus-extensie ondersteunt drie uitvoeringsmodellen, die worden bepaald door de IsBatched en IsSessionsEnabled kenmerken van uw Service Bus-trigger. De standaardwaarde voor IsBatched en IsSessionsEnabled is false.

Uitvoeringsmodel IsBatched IsSessionsEnabled Instelling gebruikt voor doeluitvoeringen per exemplaar
Verwerking van één verzending false false maxConcurrentCalls
Verwerking van één verzending (op sessie gebaseerd) false true maxConcurrentSessions
Batchverwerking true false maxMessageBatchSize of maxMessageCount

Notitie

Schaalefficiëntie: gebruik voor de Service Bus-extensie Beheerrechten voor resources voor de meest efficiënte schaalaanpassing. Als de schaal van listen-rechten wordt teruggezet naar incrementele schaal omdat de wachtrij- of onderwerplengte niet kan worden gebruikt om beslissingen over schaalaanpassing te informeren. Zie Autorisatiebeleid voor gedeelde toegang voor meer informatie over het instellen van rechten in Service Bus-toegangsbeleid.

Verwerking van één verzending

In dit model verwerkt elke aanroep van uw functie één bericht. De maxConcurrentCalls instelling bepaalt doeluitvoeringen per exemplaar. De specifieke instelling is afhankelijk van de versie van de Service Bus-extensie.

Wijzig de host.json instelling maxConcurrentCalls, zoals in het volgende voorbeeld:

{
    "version": "2.0",
    "extensions": {
        "serviceBus": {
            "maxConcurrentCalls": 16
        }
    }
}

Verwerking van één verzending (op sessie gebaseerd)

In dit model verwerkt elke aanroep van uw functie één bericht. Afhankelijk van het aantal actieve sessies voor uw Service Bus-onderwerp of -wachtrij, leaset elk exemplaar echter een of meer sessies. De specifieke instelling is afhankelijk van de versie van de Service Bus-extensie.

Wijzig de host.json instelling maxConcurrentSessions om doeluitvoeringen per exemplaar in te stellen, zoals in het volgende voorbeeld:

{
    "version": "2.0",
    "extensions": {
        "serviceBus": {
            "maxConcurrentSessions": 8
        }
    }
}

Batchverwerking

In dit model verwerkt elke aanroep van uw functie een batch berichten. De specifieke instelling is afhankelijk van de versie van de Service Bus-extensie.

Wijzig de host.json instelling maxMessageBatchSize om doeluitvoeringen per exemplaar in te stellen, zoals in het volgende voorbeeld:

{
    "version": "2.0",
    "extensions": {
        "serviceBus": {
            "maxMessageBatchSize": 1000
        }
    }
}

Event Hubs

Voor Azure Event Hubs wordt Azure Functions geschaald op basis van het aantal niet-verwerkte gebeurtenissen dat is gedistribueerd over alle partities in de Event Hub. Standaard zijn maxEventBatchSize de host.json kenmerken die worden gebruikt voor doeluitvoeringen per exemplaar en maxBatchSize. Als u er echter voor kiest om schaalaanpassing op basis van doel af te stemmen, kunt u een afzonderlijke parameter targetUnprocessedEventThreshold definiëren die overschrijft om doeluitvoeringen per exemplaar in te stellen zonder de batchinstellingen te wijzigen. Als targetUnprocessedEventThreshold dit is ingesteld, wordt het totale aantal niet-verwerkte gebeurtenissen gedeeld door deze waarde om het aantal exemplaren te bepalen, dat vervolgens wordt afgerond op een aantal werkrollen dat een evenredige partitiedistributie maakt.

Notitie

Omdat Event Hubs een gepartitioneerde workload is, wordt het aantal doelexemplaren voor Event Hubs beperkt door het aantal partities in uw Event Hub.

De specifieke instelling is afhankelijk van de versie van de Event Hubs-extensie.

Wijzig de host.json instelling maxEventBatchSize om doeluitvoeringen per exemplaar in te stellen, zoals in het volgende voorbeeld:

{
    "version": "2.0",
    "extensions": {
        "eventHubs": {
            "maxEventBatchSize" : 100
        }
    }
}

Wanneer dit is gedefinieerd in host.json, targetUnprocessedEventThreshold wordt gebruikt als doeluitvoeringen per exemplaar in plaats van maxEventBatchSize, zoals in het volgende voorbeeld:

{
    "version": "2.0",
    "extensions": {
        "eventHubs": {
            "targetUnprocessedEventThreshold": 153
        }
    }
}

Opslagwachtrijen

Wijzig voor v2.x+ van de opslagextensie de host.json instelling batchSize om doeluitvoeringen per exemplaar in te stellen:

{
    "version": "2.0",
    "extensions": {
        "queues": {
            "batchSize": 16
        }
    }
}

Notitie

Schaalefficiëntie: Voor de opslagwachtrijextensie worden berichten met visibilityTimeout nog steeds geteld in de lengte van de gebeurtenisbron door de Storage Queue-API's. Dit kan leiden tot een te grote schaalaanpassing van uw functie-app. Overweeg het gebruik van Service Bus-wachtrijen in wachtrijen voor geplande berichten, het beperken van uitschalen of het gebruik van visibilityTimeout voor uw oplossing.

Azure Cosmos DB

Azure Cosmos DB maakt gebruik van een kenmerk op functieniveau. MaxItemsPerInvocation De manier waarop u dit kenmerk op functieniveau instelt, is afhankelijk van uw functietaal.

Stel voor een gecompileerde C#-functie in uw triggerdefinitie in, MaxItemsPerInvocation zoals wordt weergegeven in de volgende voorbeelden voor een in-process C#-functie:

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}");
            }
        }
    }
}

Notitie

Omdat Azure Cosmos DB een gepartitioneerde workload is, wordt het aantal doelexemplaren voor de database beperkt door het aantal fysieke partities in uw container. Zie fysieke partities en eigendom van leases voor meer informatie over schalen van Azure Cosmos DB.

Apache Kafka

De Apache Kafka-extensie maakt gebruik van een kenmerk op functieniveau. LagThreshold Voor Kafka wordt het aantal gewenste exemplaren berekend op basis van de totale consumentenvertraging gedeeld door de LagThreshold instelling. Voor een bepaalde vertraging verhoogt het verminderen van de vertragingsdrempel het aantal gewenste exemplaren.

De manier waarop u dit kenmerk op functieniveau instelt, is afhankelijk van uw functietaal. In dit voorbeeld wordt de drempelwaarde ingesteld op 100.

Stel voor een gecompileerde C#-functie in uw triggerdefinitie in, LagThreshold zoals wordt weergegeven in de volgende voorbeelden voor een in-process C#-functie voor een Kafka Event Hubs-trigger:

[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}");
}

Volgende stappen

Zie de volgende artikelen voor meer informatie: