Skalowanie oparte na zdarzeniach w usłudze Azure Functions

W planach Zużycie i Premium usługa Azure Functions skaluje zasoby procesora CPU i pamięci przez dodanie dodatkowych wystąpień hosta usługi Functions. Liczba wystąpień jest określana na liczbę zdarzeń, które wyzwalają funkcję.

Każde wystąpienie hosta usługi Functions w planie Zużycie jest ograniczone do 1,5 GB pamięci i jednego procesora CPU. Wystąpienie hosta to cała aplikacja funkcji, co oznacza, że wszystkie funkcje w ramach aplikacji funkcji współużytkować zasób w ramach wystąpienia i skalować w tym samym czasie. Aplikacje funkcji, które współdzielą ten sam plan zużycie, są skalowane niezależnie. W planie Premium rozmiar planu określa dostępną pamięć i procesor CPU dla wszystkich aplikacji w tym planie w tym wystąpieniu.

Pliki kodu funkcji są przechowywane w udziałach usługi Azure Files na głównym koncie magazynu funkcji. Po usunięciu głównego konta magazynu aplikacji funkcji pliki kodu funkcji są usuwane i nie można ich odzyskać.

Skalowanie środowiska uruchomieniowego

Usługa Azure Functions używa składnika nazywanego kontrolerem skalowania do monitorowania szybkości zdarzeń i określania, czy należy skalować w poziomie, czy skalować w poziomie. Kontroler skalowania używa heurystyki dla każdego typu wyzwalacza. Na przykład gdy używasz wyzwalacza usługi Azure Queue Storage, jest skalowana na podstawie długości kolejki i wieku najstarszego komunikatu w kolejce.

Jednostką skalowania usługi Azure Functions jest aplikacja funkcji. Gdy aplikacja funkcji jest skalowana w poziomie, dodatkowe zasoby są przydzielane do uruchamiania wielu wystąpień hosta usługi Azure Functions. Z kolei w miarę zmniejszenia zapotrzebowania na zasoby obliczeniowe kontroler skalowania usuwa wystąpienia hosta funkcji. Liczba wystąpień jest ostatecznie "skalowana w poziomie" do zera, gdy żadne funkcje nie są uruchomione w aplikacji funkcji.

Scale controller monitoring events and creating instances

Zimny start

Po bezczynności aplikacji funkcji przez kilka minut platforma może skalować liczbę wystąpień, na których aplikacja działa do zera. Następne żądanie ma dodatkowe opóźnienie skalowania od zera do jednego. To opóźnienie jest określane jako zimny start. Liczba zależności wymaganych przez aplikację funkcji może mieć wpływ na zimny czas rozpoczęcia. Zimny start jest bardziej problemem dla operacji synchronicznych, takich jak wyzwalacze HTTP, które muszą zwrócić odpowiedź. Jeśli zimne starty wpływają na funkcje, rozważ uruchomienie w planie Premium lub w planie dedykowanym z włączonym ustawieniem Zawsze włączone .

Informacje o zachowaniach skalowania

Skalowanie może się różnić w zależności od wielu czynników i jest skalowane w różny sposób w zależności od wybranego wyzwalacza i języka. Istnieje kilka zawiłości zachowań skalowania, o których należy pamiętać:

  • Maksymalna liczba wystąpień: Pojedyncza aplikacja funkcji jest skalowana w poziomie tylko do maksymalnie 200 wystąpień. Pojedyncze wystąpienie może jednak przetwarzać więcej niż jeden komunikat lub żądanie jednocześnie, więc nie ma ustawionego limitu liczby współbieżnych wykonań. W razie potrzeby można określić niższą maksymalną skalę ograniczania przepustowości.
  • Nowa szybkość wystąpień: W przypadku wyzwalaczy HTTP nowe wystąpienia są przydzielane co najwyżej raz na sekundę. W przypadku wyzwalaczy innych niż HTTP nowe wystąpienia są przydzielane co najwyżej raz na 30 sekund. Skalowanie jest szybsze w przypadku uruchamiania w planie Premium.
  • Wydajność skalowania: W przypadku wyzwalaczy usługi Service Bus użyj opcji Zarządzaj prawami do zasobów, aby uzyskać najbardziej wydajne skalowanie. W przypadku praw nasłuchiwania skalowanie nie jest tak dokładne, ponieważ długość kolejki 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. W przypadku wyzwalaczy usługi Event Hub zapoznaj się ze wskazówkami dotyczącymi skalowania.

Ograniczanie skalowania w poziomie

Możesz ograniczyć maksymalną liczbę wystąpień używanych do skalowania w poziomie. Jest to najczęściej spotykane w przypadkach, w których składnik podrzędny, taki jak baza danych, ma ograniczoną przepływność. Domyślnie funkcje planu zużycie są skalowane w poziomie do 200 wystąpień, a funkcje planu Premium będą skalowane w poziomie do 100 wystąpień. Możesz określić niższą wartość maksymalną dla określonej aplikacji, modyfikując functionAppScaleLimit wartość. Wartość parametru functionAppScaleLimit można ustawić na 0 wartość lub null dla wartości nieograniczonej albo prawidłową wartość między 1 i maksymalną aplikacją.

az resource update --resource-type Microsoft.Web/sites -g <RESOURCE_GROUP> -n <FUNCTION_APP-NAME>/config/web --set properties.functionAppScaleLimit=<SCALE_LIMIT>
$resource = Get-AzResource -ResourceType Microsoft.Web/sites -ResourceGroupName <RESOURCE_GROUP> -Name <FUNCTION_APP-NAME>/config/web
$resource.Properties.functionAppScaleLimit = <SCALE_LIMIT>
$resource | Set-AzResource -Force

Zachowania skalowania w poziomie

Skalowanie sterowane zdarzeniami automatycznie zmniejsza pojemność, gdy zapotrzebowanie na funkcje zostanie zmniejszone. Robi to, zamykając wystąpienia procesów roboczych aplikacji funkcji. Przed zamknięciem wystąpienia nowe zdarzenia przestają być wysyłane do wystąpienia. Ponadto funkcje, które są obecnie wykonywane, mają czas na zakończenie wykonywania. To zachowanie jest rejestrowane jako tryb opróżniania. Ten okres zamknięcia może wydłużyć do 10 minut dla aplikacji planu zużycie i do 60 minut dla aplikacji planu Premium. Skalowanie oparte na zdarzeniach i takie zachowanie nie ma zastosowania do dedykowanych aplikacji planu.

Następujące zagadnienia dotyczą zachowań skalowania w poziomie:

  • W przypadku aplikacji funkcji planu zużycie działających w systemie Windows tylko aplikacje utworzone po maju 2021 r. mają domyślnie włączone zachowania trybu opróżniania.
  • Aby włączyć bezpieczne zamykanie funkcji przy użyciu wyzwalacza usługi Service Bus, użyj wersji 4.2.0 lub nowszej wersji rozszerzenia usługi Service Bus.

Wyzwalacz usługi Event Hubs

W tej sekcji opisano, jak działa skalowanie, gdy funkcja używa wyzwalacza usługi Event Hubs lub wyzwalacza usługi IoT Hub. W takich przypadkach każde wystąpienie funkcji wyzwalanej przez zdarzenie jest wspierane przez pojedyncze wystąpienie klasy EventProcessorHost . Wyzwalacz (obsługiwany przez usługę Event Hubs) zapewnia, że tylko jedno wystąpienie klasy EventProcessorHost może uzyskać dzierżawę dla danej partycji.

Rozważmy na przykład centrum zdarzeń w następujący sposób:

  • 10 partycji
  • 1000 zdarzeń dystrybuowanych równomiernie we wszystkich partycjach z 100 komunikatami w każdej partycji

Po pierwszym włączeniu funkcji istnieje tylko jedno wystąpienie funkcji. Wywołajmy pierwsze wystąpienie Function_0funkcji . Funkcja Function_0 ma jedno wystąpienie klasy EventProcessorHost , które przechowuje dzierżawę na wszystkich dziesięciu partycjach. To wystąpienie odczytuje zdarzenia z partycji 0–9. Od tego momentu następuje jedna z następujących czynności:

  • Nowe wystąpienia funkcji nie są potrzebne: Function_0 jest w stanie przetworzyć wszystkie 1000 zdarzeń, zanim logika skalowania funkcji zacznie obowiązywać. W tym przypadku wszystkie 1000 komunikatów jest przetwarzanych przez program Function_0.

  • Dodano dodatkowe wystąpienie funkcji: jeśli logika skalowania funkcji określi, że Function_0 ma więcej komunikatów niż może przetworzyć, zostanie utworzone nowe wystąpienie aplikacji funkcji (Function_1). Ta nowa funkcja ma również skojarzone wystąpienie klasy EventProcessorHost. Ponieważ bazowe usługi Event Hubs wykrywają, że nowe wystąpienie hosta próbuje odczytywać komunikaty, równoważy obciążenie partycji między wystąpieniami hosta. Na przykład partycje 0–4 mogą być przypisane do Function_0 partycji i partycje 5–9 do .Function_1

  • Dodano n więcej wystąpień funkcji: jeśli logika skalowania funkcji określi, że i Function_0Function_1 mają więcej komunikatów niż mogą przetwarzać, tworzone są nowe Functions_N wystąpienia aplikacji funkcji. Aplikacje są tworzone do punktu, w którym N jest większa niż liczba partycji centrum zdarzeń. W naszym przykładzie usługa Event Hubs ponownie równoważy obciążenie partycji, w tym przypadku między wystąpieniami Function_0...Functions_9.

W miarę N skalowania wystąpień liczba wystąpień jest większa niż liczba partycji centrum zdarzeń. Ten wzorzec służy do zapewniania dostępności wystąpień klasy EventProcessorHost w celu uzyskania blokad na partycjach w miarę ich udostępniania z innych wystąpień. Opłaty są naliczane tylko za zasoby używane podczas wykonywania wystąpienia funkcji. Innymi słowy, nie są naliczane opłaty za tę nadmierną aprowizację.

Po zakończeniu wykonywania wszystkich funkcji (z błędami lub bez błędów) punkty kontrolne są dodawane do skojarzonego konta magazynu. Po pomyślnym zakończeniu sprawdzania wszystkie 1000 komunikatów nigdy nie są pobierane ponownie.

Najlepsze rozwiązania i wzorce dla skalowalnych aplikacji

Istnieje wiele aspektów aplikacji funkcji, które mają wpływ na sposób skalowania, w tym konfigurację hosta, ślad środowiska uruchomieniowego i wydajność zasobów. Aby uzyskać więcej informacji, zobacz sekcję dotyczącą skalowalności artykułu z zagadnieniami dotyczącymi wydajności. Należy również wiedzieć, jak działają połączenia w miarę skalowania aplikacji funkcji. Aby uzyskać więcej informacji, zobacz Jak zarządzać połączeniami w usłudze Azure Functions.

Aby uzyskać więcej informacji na temat skalowania w języku Python i Node.js, zobacz Przewodnik dla deweloperów języka Python dotyczący skalowania i współbieżności oraz usługi Azure Functions Node.js — przewodnik dla deweloperów — skalowanie i współbieżność.

Model rozliczania

Rozliczenia dla różnych planów zostały szczegółowo opisane na stronie cennika usługi Azure Functions. Użycie jest agregowane na poziomie aplikacji funkcji i zlicza tylko czas wykonywania kodu funkcji. Poniżej przedstawiono jednostki rozliczeń:

  • Zużycie zasobów w gigabajtach sekund (GB-s). Obliczane jako kombinacja rozmiaru pamięci i czasu wykonywania dla wszystkich funkcji w aplikacji funkcji.
  • Wykonania. Liczone za każdym razem, gdy funkcja jest wykonywana w odpowiedzi na wyzwalacz zdarzenia.

Przydatne zapytania i informacje na temat sposobu zrozumienia rachunku za użycie można znaleźć w często zadawanych pytaniach dotyczących rozliczeń.

Następne kroki