Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Skalowanie oparte na obiekcie docelowym zapewnia szybki i intuicyjny model skalowania dla klientów i jest obecnie obsługiwany w przypadku tych rozszerzeń powiązań:
- Apache Kafka
- Azure Cosmos DB
- Azure Event Hubs
- Azure Queue Storage
- Azure Service Bus (kolejka i tematy)
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:
W tym równaniu długość źródła zdarzeń odnosi się do liczby zdarzeń, które należy przetworzyć. Domyślne wartości docelowych wykonań na instancję pochodzą z SDK używanych przez rozszerzenia 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, planie Flex Consumption i planach Elastic Premium. Skalowanie sterowane zdarzeniami nie jest obsługiwane w przypadku uruchamiania w planach dedykowanych (App Service).
- Skalowanie oparte na elementach docelowych jest domyślnie włączone od wersji 4.19.0 środowiska uruchomieniowego usługi Functions.
- W przypadku korzystania ze skalowania opartego na obiekcie docelowym limity skalowania są 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. Należy również rozważyć uruchomienie planu Flex Consumption, który oferuje skalowanie poszczególnych 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 (Funkcje v2.x+, Pojedyncze Rozsyłanie) | 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ń konfiguracja docelowych wykonań na wystąpienie jest ustawiana za pomocą 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
Gdy monitorowanie skalowania w czasie wykonywania jest włączone, rozszerzenia same obsługują skalowanie dynamiczne, 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 |
| Centra zdarzeń | 5.2.0 |
| Magistrala usług | 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 wykonywanie _target na wartość wystąpienia jest określane automatycznie przez funkcję dynamicznej współbieżności. 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 praw nasłuchiwania skalowanie jest przywracane 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 host.json , maxConcurrentSessions 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 host.json , maxMessageBatchSize aby ustawić docelowe wykonania na wystąpienie, jak w poniższym przykładzie:
{
"version": "2.0",
"extensions": {
"serviceBus": {
"maxMessageBatchSize": 1000
}
}
}
Centra zdarzeń
W przypadku usługi Azure Event Hubs, usługa Azure Functions skaluje się w oparciu o liczbę nieprzetworzonych zdarzeń rozmieszczonych we wszystkich partycjach centrum zdarzeń, zgodnie z listą dozwolonych liczników wystąpień. 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.
Ostrzeżenie
Ustawienie batchCheckpointFrequency powyżej 1 dla planów hostingu obsługiwanych przez skalowanie na podstawie celu może spowodować nieprawidłowe zachowanie skalowania. Platforma oblicza nieprzetworzone zdarzenia jako "bieżąca pozycja — pozycja punktów kontrolnych", co może niepoprawnie wskazywać nieprzetworzone komunikaty, gdy partie zostały przetworzone, ale nie zostały jeszcze określone, uniemożliwiając właściwe skalowanie w poziomie, gdy żadne komunikaty nie pozostają.
Zachowanie i stabilność procesów skalowania
W przypadku usługi Event Hubs, częste operacje skalowania w górę i w dół mogą wywoływać ponowne równoważenie partycji, co prowadzi do opóźnienia w przetwarzaniu i zwiększonej latencji. Aby rozwiązać ten problem:
- Platforma używa wstępnie zdefiniowanej listy prawidłowych liczby pracowników do podejmowania decyzji dotyczących skalowania.
- Platforma zapewnia, że skalowanie jest stabilne i celowe, unikając zakłócających zmian przypisań partycji.
- Jeśli żądana liczba pracowników nie znajduje się na prawidłowej liście — na przykład 17, system automatycznie wybiera kolejną największą prawidłową liczbę, która w tym przypadku wynosi 32. Ponadto, aby zapobiec szybkiemu, powtarzanemu skalowaniu, żądania skalowania w dół są ograniczane przez 3 minuty po ostatnim skalowaniu w górę. To opóźnienie pomaga zmniejszyć niepotrzebne rebalansowanie i przyczynia się do utrzymania efektywności przepustowości.
Prawidłowe liczby wystąpień dla usługi Event Hubs
Dla każdej liczby partycji usługi Event Hubs obliczamy odpowiednią listę prawidłowych liczb wystąpień, aby zapewnić optymalną dystrybucję i efektywne skalowanie. Te liczby są wybierane, aby w pełni spełniać wymagania dotyczące partycjonowania i współbieżności.
| Liczba partycji | Prawidłowe liczby wystąpień |
|---|---|
| 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] |
Te wstępnie zdefiniowane liczby pomagają zapewnić równomierne rozdzielanie wystąpień między partycje, co minimalizuje bezczynność lub przeciążenie pracowników.
Uwaga
Uwaga: w przypadku warstw premium i dedykowanego centrum zdarzeń liczba partycji może przekraczać 32, co pozwala na większe prawidłowe zestawy liczby wystąpień. Te poziomy obsługują większą przepływność i skalowalność, a odpowiednia lista liczby pracowników jest rozszerzana, aby równomiernie dystrybuować partycje centrum zdarzeń Event Hub między wystąpieniami. Ponadto, ponieważ usługa Event Hubs jest obciążeniem podzielonym na partycje, liczba partycji w centrum zdarzeń jest limitem maksymalnej liczby wystąpień docelowych.
Ustawienia usługi Event Hubs
Określone ustawienie zależy od wersji rozszerzenia usługi Event Hubs.
Zmodyfikuj ustawienie host.json , maxEventBatchSize 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 partycji fizycznych w kontenerze jest limitem liczby wystąpień docelowych. 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: