Skalowanie na podstawie celu

Skalowanie oparte na obiekcie docelowym zapewnia szybki i intuicyjny model skalowania dla klientów i jest obecnie obsługiwany w przypadku następujących rozszerzeń:

Skalowanie na podstawie celu zastępuje poprzedni model skalowania przyrostowego usługi Azure Functions jako domyślny dla tych typów rozszerzeń. Skalowanie przyrostowe dodano lub usunięto maksymalnie jeden proces roboczy z każdą nową szybkością wystąpień ze złożonymi decyzjami dotyczącymi tego, kiedy przeprowadzić skalowanie. Natomiast skalowanie na podstawie celu umożliwia skalowanie w górę czterech wystąpień naraz, a decyzja o skalowaniu jest oparta na prostym równaniu opartym na obiekcie docelowym:

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

Domyślne wykonania docelowe na wartości wystąpienia pochodzą z zestawów SDK używanych przez rozszerzenia usługi Azure Functions. Nie musisz wprowadzać żadnych zmian w celu skalowania na podstawie celu.

Kwestie wymagające rozważenia

Podczas korzystania ze skalowania na podstawie celu należy wziąć pod uwagę następujące kwestie:

  • Skalowanie na podstawie celu jest domyślnie włączone dla aplikacji funkcji w planie Zużycie lub w planach Premium, ale możesz zrezygnować. Skalowanie sterowane zdarzeniami nie jest obsługiwane w przypadku uruchamiania w planach dedykowanych (App Service).
  • Skalowanie oparte na obiektach docelowych jest domyślnie włączone w środowisku uruchomieniowym aplikacji funkcji w wersji 4.19.0 lub nowszej.
  • W przypadku korzystania ze skalowania functionAppScaleLimit opartego na obiekcie docelowym ustawienie witryny jest nadal uznawane. Aby uzyskać więcej informacji, zobacz Ograniczanie skalowania w poziomie.
  • Aby osiągnąć najbardziej dokładne skalowanie na podstawie metryk, użyj tylko jednej funkcji wyzwalanej na podstawie celu dla aplikacji funkcji.
  • Gdy wiele funkcji w tej samej aplikacji funkcji żąda skalowania w poziomie w tym samym czasie, suma w tych funkcjach jest używana do określenia zmiany w żądanych wystąpieniach. Funkcje żądające skalowania w poziomie zastępują funkcje żądające skalowania w poziomie.
  • Jeśli istnieją żądania skalowane w poziomie bez żadnych żądań skalowania w poziomie, jest używana maksymalna skala w wartości.

Rezygnacja

Skalowanie na podstawie celu jest domyślnie włączone dla aplikacji funkcji hostowanych w planie Zużycie lub w planach Premium. Aby wyłączyć skalowanie na podstawie celu i powrócić do skalowania przyrostowego, dodaj następujące ustawienie aplikacji do aplikacji funkcji:

Ustawienia aplikacji Wartość
TARGET_BASED_SCALING_ENABLED 0

Dostosowywanie skalowania opartego na obiekcie docelowym

Zachowanie skalowania może być bardziej lub mniej agresywne w oparciu o obciążenie aplikacji, dostosowując docelowe wykonania na wystąpienie. Każde rozszerzenie ma różne ustawienia, których można użyć do ustawiania docelowych wykonań na wystąpienie.

W tej tabeli przedstawiono podsumowanie host.json wartości używanych do wykonywania docelowego dla wartości wystąpienia i wartości domyślnych:

Numer wewnętrzny host.json wartości Wartość domyślna
Event Hubs (rozszerzenie w wersji 5.x+) extensions.eventHubs.maxEventBatchSize 100*
Event Hubs (rozszerzenie w wersji 3.x+) extensions.eventHubs.eventProcessorOptions.maxBatchSize 10
Event Hubs (jeśli zdefiniowano) extensions.eventHubs.targetUnprocessedEventThreshold nie dotyczy
Service Bus (rozszerzenie w wersji 5.x+, pojedyncza wysyłka) extensions.serviceBus.maxConcurrentCalls 16
Service Bus (rozszerzenie w wersji 5.x+, oparta na sesjach pojedynczej wysyłki) extensions.serviceBus.maxConcurrentSessions 8
Service Bus (rozszerzenie w wersji 5.x+, przetwarzanie wsadowe) extensions.serviceBus.maxMessageBatchSize 1000
Service Bus (Functions v2.x+, Single Dispatch) extensions.serviceBus.messageHandlerOptions.maxConcurrentCalls 16
Service Bus (funkcje w wersji 2.x+, oparte na sesjach pojedynczej wysyłki) extensions.serviceBus.sessionHandlerOptions.maxConcurrentSessions 2000
Service Bus (Funkcje w wersji 2.x+, Przetwarzanie wsadowe) extensions.serviceBus.batchOptions.maxMessageCount 1000
Kolejka magazynu extensions.queues.batchSize 16

* Wartość domyślna maxEventBatchSize została zmieniona w wersji 6.0.0Microsoft.Azure.WebJobs.Extensions.EventHubs pakietu. We wcześniejszych wersjach ta wartość wynosiła 10.

W przypadku niektórych rozszerzeń powiązań docelowe wykonania na wystąpienie są ustawiane przy użyciu atrybutu funkcji:

Numer wewnętrzny Ustawienie wyzwalacza funkcji Wartość domyślna
Apache Kafka lagThreshold 1000
Azure Cosmos DB maxItemsPerInvocation 100

Aby dowiedzieć się więcej, zobacz przykładowe konfiguracje obsługiwanych rozszerzeń.

Plan Premium z włączonym monitorowaniem skalowania w czasie wykonywania

Po włączeniu monitorowania skalowania w czasie wykonywania rozszerzenia obsługują skalowanie dynamiczne. Dzieje się tak, ponieważ kontroler skalowania nie ma dostępu do usług zabezpieczonych przez sieć wirtualną. Po włączeniu monitorowania skalowania w czasie wykonywania należy uaktualnić pakiety rozszerzeń do tych minimalnych wersji, aby odblokować dodatkową funkcję skalowania na podstawie celu:

Nazwa rozszerzenia Wymagana minimalna wersja
Apache Kafka 3.9.0
Azure Cosmos DB 4.1.0
Event Hubs 5.2.0
Service Bus 5.9.0
Kolejka magazynu 5.1.0

Obsługa dynamicznej współbieżności

Skalowanie oparte na obiekcie docelowym wprowadza szybsze skalowanie i używa wartości domyślnych dla wykonań docelowych na wystąpienie. W przypadku korzystania z usługi Service Bus, kolejek magazynu lub platformy Kafka można również włączyć współbieżność dynamiczną. W tej konfiguracji docelowe wykonania na wartość wystąpienia są określane automatycznie przez funkcję współbieżności dynamicznej. Zaczyna się od ograniczonej współbieżności i identyfikuje najlepsze ustawienie w czasie.

Obsługiwane rozszerzenia

Sposób konfigurowania skalowania na podstawie celu w pliku host.json zależy od określonego typu rozszerzenia. Ta sekcja zawiera szczegółowe informacje o konfiguracji rozszerzeń, które obecnie obsługują skalowanie na podstawie celu.

Kolejki i tematy usługi Service Bus

Rozszerzenie usługi Service Bus obsługuje trzy modele wykonywania określone przez IsBatched atrybuty i IsSessionsEnabled wyzwalacza usługi Service Bus. Wartość domyślna dla IsBatched elementu i IsSessionsEnabled to false.

Model wykonywania IsBatched IsSessionsEnabled Ustawienie używane do wykonywania docelowych na wystąpienie
Przetwarzanie pojedynczej wysyłki fałsz fałsz Maxconcurrentcalls
Przetwarzanie pojedynczej wysyłki (oparte na sesji) fałsz prawda Maxconcurrentsessions
Przetwarzanie wsadowe prawda fałsz maxMessageBatchSize lub maxMessageCount

Uwaga

Wydajność skalowania: w przypadku rozszerzenia usługi Service Bus użyj opcji Zarządzaj prawami do zasobów w celu uzyskania najbardziej wydajnego skalowania. W przypadku skalowania praw nasłuchiwania przywraca się do skalowania przyrostowego, ponieważ długość kolejki lub tematu nie może służyć do informowania o decyzjach dotyczących skalowania. Aby dowiedzieć się więcej na temat ustawiania praw w zasadach dostępu usługi Service Bus, zobacz Zasady autoryzacji dostępu współdzielonego.

Przetwarzanie pojedynczej wysyłki

W tym modelu każde wywołanie funkcji przetwarza jeden komunikat. Ustawienie maxConcurrentCalls określa docelowe wykonania na wystąpienie. Określone ustawienie zależy od wersji rozszerzenia usługi Service Bus.

Zmodyfikuj host.json ustawienie maxConcurrentCalls, jak w poniższym przykładzie:

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

Przetwarzanie pojedynczej wysyłki (oparte na sesji)

W tym modelu każde wywołanie funkcji przetwarza jeden komunikat. Jednak w zależności od liczby aktywnych sesji dla tematu lub kolejki usługi Service Bus każde wystąpienie dzierżawi co najmniej jedną sesję. Określone ustawienie zależy od wersji rozszerzenia usługi Service Bus.

Zmodyfikuj ustawienie maxConcurrentSessions , host.json aby ustawić docelowe wykonania na wystąpienie, jak w poniższym przykładzie:

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

Przetwarzanie wsadowe

W tym modelu każde wywołanie funkcji przetwarza partię komunikatów. Określone ustawienie zależy od wersji rozszerzenia usługi Service Bus.

Zmodyfikuj ustawienie maxMessageBatchSize , host.json aby ustawić docelowe wykonania na wystąpienie, jak w poniższym przykładzie:

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

Event Hubs

W przypadku usługi Azure Event Hubs usługa Azure Functions jest skalowana na podstawie liczby nieprzetworzonych zdarzeń rozproszonych we wszystkich partycjach w centrum zdarzeń. Domyślnie host.json atrybuty używane do wykonywania obiektów docelowych na wystąpienie to maxEventBatchSize i maxBatchSize. Jeśli jednak zdecydujesz się dostosować skalowanie oparte na obiekcie docelowym, możesz zdefiniować oddzielny parametr targetUnprocessedEventThreshold , który zastępuje ustawianie docelowych wykonań na wystąpienie bez zmieniania ustawień wsadowych. Jeśli targetUnprocessedEventThreshold jest ustawiona, łączna liczba nieprzetworzonych zdarzeń jest podzielona przez tę wartość w celu określenia liczby wystąpień, która jest następnie zaokrąglona do liczby wystąpień procesu roboczego, która tworzy zrównoważoną dystrybucję partycji.

Uwaga

Ponieważ usługa Event Hubs jest obciążeniem podzielonym na partycje, liczba wystąpień docelowych dla usługi Event Hubs jest ograniczona przez liczbę partycji w centrum zdarzeń.

Określone ustawienie zależy od wersji rozszerzenia usługi Event Hubs.

Zmodyfikuj ustawienie maxEventBatchSize , host.json aby ustawić docelowe wykonania na wystąpienie, jak w poniższym przykładzie:

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

Po zdefiniowaniu w programie host.jsontargetUnprocessedEventThreshold parametr jest używany jako docelowe wykonania dla wystąpienia zamiast maxEventBatchSize, jak w poniższym przykładzie:

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

Kolejki usługi Storage

W przypadku rozszerzenia Storage w wersji 2.x+ zmodyfikuj host.json ustawienie batchSize , aby ustawić docelowe wykonania na wystąpienie:

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

Uwaga

Wydajność skalowania: w przypadku rozszerzenia kolejki magazynu komunikaty o widocznościTimeout są nadal liczone w długości źródła zdarzeń przez interfejsy API kolejki magazynu. Może to spowodować nadmierne skalowanie aplikacji funkcji. Rozważ użycie kolejek usługi Service Bus que zaplanowanych komunikatów, ograniczenia skalowania w poziomie lub braku widocznościTimeout dla rozwiązania.

Azure Cosmos DB

Usługa Azure Cosmos DB używa atrybutu na poziomie funkcji . MaxItemsPerInvocation Sposób ustawiania tego atrybutu na poziomie funkcji zależy od języka funkcji.

Dla skompilowanej funkcji języka C# ustaw MaxItemsPerInvocation w definicji wyzwalacza, jak pokazano w poniższych przykładach dla funkcji języka C# w procesie:

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

Uwaga

Ponieważ usługa Azure Cosmos DB jest obciążeniem podzielonym na partycje, liczba wystąpień docelowych dla bazy danych jest ograniczona przez liczbę partycji fizycznych w kontenerze. Aby dowiedzieć się więcej na temat skalowania usługi Azure Cosmos DB, zobacz partycje fizyczne i własność dzierżawy.

Apache Kafka

Rozszerzenie Apache Kafka używa atrybutu LagThresholdna poziomie funkcji . W przypadku platformy Kafka liczba żądanych wystąpień jest obliczana na podstawie łącznego opóźnienia konsumentów podzielonego LagThreshold przez ustawienie. W przypadku danego opóźnienia zmniejszenie progu opóźnienia zwiększa liczbę żądanych wystąpień.

Sposób ustawiania tego atrybutu na poziomie funkcji zależy od języka funkcji. W tym przykładzie ustawiono próg na 100wartość .

W przypadku skompilowanej funkcji języka C# ustaw LagThreshold w definicji wyzwalacza, jak pokazano w poniższych przykładach dla funkcji języka C# w procesie dla wyzwalacza usługi Event Hubs platformy Kafka:

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

Następne kroki

Więcej informacji można znaleźć w następujących artykułach: