Delen via


Schaalaanpassing op basis van doel

Op doel gebaseerde schaalaanpassing biedt een snel en intuïtief schaalmodel voor klanten en wordt momenteel ondersteund voor deze bindingsextensies:

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:

Afbeelding van de vergelijking: gewenste exemplaren = lengte van gebeurtenisbron/doeluitvoeringen per exemplaar.

In deze vergelijking verwijst de lengte van de gebeurtenisbron naar het aantal gebeurtenissen dat moet worden verwerkt. De standaarddoeluitvoeringen per exemplaar zijn afkomstig van de SDK's (Software Development Kits) 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, Flex Consumption-abonnement en Elastic Premium-abonnementen. Gebeurtenisgestuurd schalen wordt niet ondersteund bij het uitvoeren van toegewezen (App Service)-abonnementen.
  • Schalen op basis van doel is standaard ingeschakeld vanaf versie 4.19.0 van de Functions-runtime.
  • Wanneer u schaalaanpassing op basis van doel gebruikt, worden schaallimieten 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. U moet ook overwegen om te worden uitgevoerd in een Flex Consumption-abonnement, dat schaalaanpassing per functie biedt.
  • 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 (Extensie v5.x+, Single Dispatch) extensions.serviceBus.maxConcurrentCalls 16
Service Bus (Extension v5.x+, op Sessies gebaseerd op eenmalige verzending) extensions.serviceBus.maxConcurrentSessions 8
Service Bus (Extension v5.x+, Batchverwerking) extensions.serviceBus.maxMessageBatchSize 1000
Servicebus (Functies v2.x+, Enkele Dispatch) extensions.serviceBus.messageHandlerOptions.maxConcurrentCalls 16
Service Bus (Functions v2.x+, op basis van enkelvoudige verzendingssessies) extensions.serviceBus.sessionHandlerOptions.maxConcurrentSessions 2000
Service Bus (Functies v2.x+, Batchverwerking) 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 de doeluitvoeringen per exemplaar ingesteld met behulp van een functie-attribuut:

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 dynamische schaalaanpassing omdat de schaalcontroller geen toegang heeft tot services die zijn 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 wordt de _target uitvoering 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. Met luisterrechten wordt het schalen teruggeschakeld naar een incrementele schaal omdat de lengte van de wachtrij of het onderwerp niet kan worden gebruikt voor het nemen van beslissingen over het aanpassen van de schaal. 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 schaalt Azure Functions op basis van het aantal niet-verwerkte gebeurtenissen dat is verdeeld over alle partities in de Event Hub binnen een lijst met een aantal geldige instanties. Standaard zijn host.json de kenmerken die worden gebruikt voor maxEventBatchSize 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.

Schaalgedrag en stabiliteit

Voor Event Hubs kunnen frequente in- en uitschaalbewerkingen partitieherverdeling activeren, wat leidt tot verwerkingsvertragingen en verhoogde latentie. U kunt dit als volgt verhelpen:

  • Het platform maakt gebruik van een vooraf gedefinieerde lijst met geldige werkrollen om beslissingen over schaalaanpassing te begeleiden.
  • Het platform zorgt ervoor dat schalen stabiel en opzettelijk is, waardoor verstorende wijzigingen in partitietoewijzingen worden vermeden.
  • Als het gewenste aantal werknemers zich niet in de geldige lijst bevindt, bijvoorbeeld 17, selecteert het systeem automatisch het dichtstbijzijnde grotere geldige aantal, dat in dit geval 32 is. Om snelle herhaalde schaalaanpassingen te voorkomen, worden afschalingsverzoeken 3 minuten vertraagd na de laatste schaalvergroting. Deze vertraging helpt onnodige herverdeling te verminderen en draagt bij aan het handhaven van de doorvoerefficiëntie.

Geldige aantal exemplaren voor Event Hubs

Voor ieder Event Hubs-partitieaantal berekenen we een bijbehorende lijst met geldige instantieaantallen om een optimale verdeling en efficiënte schaalbaarheid te garanderen. Deze aantallen worden gekozen om goed af te stemmen op de vereisten voor partitionering en gelijktijdigheid:

Aantal partities Geldige instanties tellen
1 [1]
2 [1, 2]
4 [1, 2, 4]
8 [1, 2, 3, 4, 8]
10 [1, 2, 3, 4, 5, 10]
16 [1, 2, 3, 4, 5, 6, 8, 16]
32 [1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 16, 32]

Deze vooraf gedefinieerde aantallen helpen om ervoor te zorgen dat instanties zo gelijkmatig mogelijk worden verdeeld over partities, waardoor niet-actieve of overbelaste werkers worden geminimaliseerd.

Notitie

Opmerking: Voor Premium- en Dedicated Event Hub-lagen kan het aantal partities groter zijn dan 32, waardoor grotere aantallen geldige exemplaren mogelijk zijn. Deze lagen ondersteunen hogere doorvoer en schaalbaarheid en de geldige lijst met werkrollen wordt dienovereenkomstig uitgebreid om event hub-partities gelijkmatig over exemplaren te verdelen. Omdat Event Hubs een gepartitioneerde workload is, is het aantal partities in uw Event Hub ook de limiet voor het maximumaantal doelexemplaren.

Event Hubs-instellingen

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, is het aantal fysieke partities in uw container de limiet voor het aantal doelexemplaren. 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: