Udostępnij za pomocą


Współbieżność w usłudze Azure Functions

W Azure Functions pojedyncze wystąpienie aplikacji funkcji Azure umożliwia jednoczesne przetwarzanie wielu zdarzeń. Ponieważ są one uruchamiane w tym samym wystąpieniu obliczeniowym, współużytkują pamięć, procesor CPU i zasoby połączenia. W niektórych planach hostingu wysokie zapotrzebowanie na określone wystąpienie powoduje, że host usługi Functions automatycznie tworzy nowe wystąpienia do obsługi zwiększonego obciążenia. W tych planach skalowania dynamicznego występuje kompromis między współbieżnością a skalowalnością. Aby zapewnić większą kontrolę nad sposobem działania aplikacji, usługa Functions umożliwia zarządzanie liczbą współbieżnych wykonań.

Funkcje zapewniają dwa główne sposoby zarządzania współbieżnością:

  • Stała współbieżność dla wystąpienia: można skonfigurować limity na poziomie hosta, które są specyficzne dla konkretnych wyzwalaczy. Ten model jest domyślnym zachowaniem współbieżności dla funkcji.
  • Współbieżność dynamiczna: w przypadku niektórych typów wyzwalaczy host usługi Functions może automatycznie określić najlepszy poziom współbieżności dla tego wyzwalacza w aplikacji funkcji. Musisz wyrazić zgodę na ten model współbieżności.

W tym artykule opisano zachowania współbieżności wyzwalaczy sterowanych zdarzeniami w usłudze Functions oraz sposób, w jaki te zachowania wpływają na skalowanie w planach dynamicznych. Porównuje również stałe modele współbieżności na wystąpienie i dynamiczne.

Skalowanie a współbieżność

W przypadku funkcji korzystających z wyzwalaczy opartych na zdarzeniach lub reagujących na żądania HTTP można szybko osiągnąć limity współbieżnych wykonań w okresach wysokiego zapotrzebowania. W takich okresach musisz mieć możliwość skalowania swojej aplikacji funkcji poprzez dodanie instancji, aby uniknąć zaległości w przetwarzaniu nadchodzących żądań. Sposób skalowania aplikacji zależy od planu hostingu:

Typ skalowania Plany hostingu opis
Dynamiczne (sterowane zdarzeniami) skalowanie Zużycie
Elastyczne zużycie
Premium
W planie skalowania dynamicznego host skaluje liczbę wystąpień funkcji aplikacji w górę lub w dół na podstawie liczby zdarzeń napływających. Aby uzyskać więcej informacji, zobacz Skalowanie oparte na zdarzeniach w usłudze Azure Functions.
Skalowanie ręczne Plany dedykowane (App Service) W przypadku hostowania aplikacji funkcji w ramach planu dedykowanego należy ręcznie skonfigurować wystąpienia w okresach wyższego obciążenia lub ustawić schemat skalowania automatycznego.

Przed rozpoczęciem skalowania aplikacja funkcji próbuje obsłużyć wzrost obciążenia, obsługując wiele wywołań tego samego typu w jednym wystąpieniu. W rezultacie te współbieżne wykonania w danym wystąpieniu mają bezpośredni wpływ na decyzje dotyczące skalowania. Na przykład gdy aplikacja w planie skalowania dynamicznego osiągnie limit współbieżności, może być konieczne skalowanie, aby nadążyć za zapotrzebowaniem przychodzącym.

Równowaga skali w porównaniu z współbieżnością, którą próbujesz osiągnąć w aplikacji, zależy od tego, gdzie mogą wystąpić wąskie gardła: w przetwarzaniu (ograniczenia procesów intensywnie korzystających z procesora CPU) lub w usłudze podrzędnej (ograniczenia oparte na we/wy).

Ustalono współbieżność dla poszczególnych wystąpień

Domyślnie większość wyzwalaczy obsługuje stały model konfiguracji współbieżności dla wystąpienia za pośrednictwem skalowania na podstawie celu. W tym modelu każdy typ wyzwalacza ma limit współbieżności dla wystąpienia.

Możesz zastąpić domyślne wartości współbieżności dla większości wyzwalaczy, ustawiając konkretną współbieżność dla instancji tego typu wyzwalacza. W przypadku wielu wyzwalaczy należy skonfigurować ustawienia współbieżności w plikuhost.json. Na przykład wyzwalacz usługi Azure Service Bus udostępnia zarówno ustawienie MaxConcurrentCalls, jak i MaxConcurrentSessions w host.json. Te ustawienia współpracują ze sobą, aby kontrolować maksymalną liczbę komunikatów, które każda aplikacja funkcji przetwarza jednocześnie w każdym wystąpieniu.

W niektórych scenariuszach skalowania na podstawie celu, takich jak w przypadku korzystania z wyzwalacza Apache Kafka lub Azure Cosmos DB, konfiguracja współbieżności znajduje się w deklaracji funkcji, a nie w pliku host.json . Inne typy wyzwalaczy mają wbudowane mechanizmy wywoływania równoważenia obciążenia między wystąpieniami. Na przykład usługi Azure Event Hubs i Azure Cosmos DB używają schematu opartego na partycjach.

W przypadku typów wyzwalaczy obsługujących konfigurację współbieżności ustawienia współbieżności są stosowane do wszystkich uruchomionych wystąpień. Dzięki temu można kontrolować maksymalną współbieżność funkcji w każdym wystąpieniu. Gdy funkcja jest na przykład intensywnie obciążająca procesor lub zasoby, możesz ograniczyć współbieżność, aby utrzymać dobrą kondycję wystąpień. W takim przypadku można polegać na skalowaniu w celu obsługi zwiększonych obciążeń. Podobnie, gdy funkcja wysyła żądania do usługi podrzędnej, która jest ograniczana, należy również rozważyć ograniczenie współbieżności, aby uniknąć przeciążenia usługi podrzędnej.

Współbieżność wyzwalacza HTTP

Dotyczy tylko planu Flex Consumption

Współbieżność wyzwalacza HTTP to specjalny typ współbieżności ustalonej dla poszczególnych wystąpień. W przypadku współbieżności wyzwalacza HTTP domyślna współbieżność zależy również od rozmiaru wystąpienia.

Plan Flex Consumption skaluje wszystkie funkcje wyzwalacza HTTP razem jako grupę. Aby uzyskać więcej informacji, zobacz Skalowanie poszczególnych funkcji.

W poniższej tabeli przedstawiono domyślne ustawienie współbieżności dla wyzwalaczy HTTP w danym wystąpieniu na podstawie skonfigurowanego rozmiaru pamięci wystąpienia:

Rozmiar wystąpienia (MB) Domyślna współbieżność*
512 4
2,048 16
4,096 32

*We wszystkich aplikacjach języka Python domyślnie wszystkie rozmiary wystąpień używają poziomu współbieżności wyzwalacza HTTP wynoszącego jeden.

Te wartości domyślne powinny działać dobrze w większości przypadków i można zacząć od nich. Należy wziąć pod uwagę, że w danej liczbie żądań HTTP zwiększenie wartości współbieżności HTTP zmniejsza liczbę wystąpień wymaganych do obsługi żądań HTTP. Podobnie zmniejszenie wartości współbieżności HTTP wymaga większej liczby wystąpień do obsługi tego samego obciążenia.

Jeśli musisz dostosować współbieżność HTTP, możesz to zrobić przy użyciu interfejsu wiersza polecenia platformy Azure. Aby uzyskać więcej informacji, zobacz Ustawianie limitów współbieżności HTTP.

Domyślne wartości współbieżności w poprzedniej tabeli mają zastosowanie tylko wtedy, gdy nie ustawisz własnego ustawienia współbieżności HTTP. Jeśli nie ustawisz jawnie ustawienia współbieżności HTTP, domyślna współbieżność zwiększa się, jak pokazano w tabeli podczas zmiany rozmiaru wystąpienia. Po ustawieniu wartości współbieżności HTTP ta wartość jest zachowywana pomimo zmian rozmiaru wystąpienia.

Określanie optymalnej współbieżności na poszczególne wystąpienie

Stałe konfiguracje współbieżności dla instancji dają kontrolę nad określonymi zachowaniami wyzwalaczy, takimi jak ograniczanie funkcji. Jednak określenie optymalnych wartości dla tych ustawień może być trudne. Ogólnie rzecz biorąc, należy uzyskać akceptowalne wartości przez iteracyjny proces testowania obciążenia. Nawet po określeniu zestawu wartości, które działają dla określonego profilu ładowania, liczba zdarzeń pochodzących z połączonych usług może ulec zmianie z dnia na dzień. Ta zmienność może spowodować uruchomienie aplikacji z nieoptymalnymi wartościami. Na przykład aplikacja funkcji może przetwarzać wymagające ładunki wiadomości w ostatnim dniu tygodnia, co wymaga zmniejszenia poziomu współbieżności. Jednak w pozostałej części tygodnia ładunki komunikatów mogą być lżejsze, co oznacza, że można wtedy użyć wyższego poziomu współbieżności.

W idealnym przypadku system powinien umożliwiać wystąpieniom przetwarzanie jak największej ilości pracy, jednocześnie utrzymując zdrowie każdego wystąpienia oraz niski poziom opóźnień. Współbieżność dynamiczna jest przeznaczona do tego celu.

Współbieżność dynamiczna

Funkcje udostępniają dynamiczny model współbieżności, upraszczając konfigurowanie wszystkich funkcji aplikacji uruchamianych w tym samym planie.

Uwaga

Współbieżność dynamiczna jest obecnie obsługiwana tylko w przypadku wyzwalaczy usługi Azure Blob Storage, Azure Queue Storage i Service Bus. Ponadto należy użyć wersji rozszerzeń wymienionych w sekcji Obsługa rozszerzeń w dalszej części tego artykułu.

Świadczenia

Współbieżność dynamiczna zapewnia następujące korzyści:

  • Uproszczona konfiguracja: nie trzeba już ręcznie określać ustawień współbieżności wyzwalacza. System uczy się optymalnych wartości obciążenia w czasie.
  • Dynamiczne korekty: współbieżność jest dostosowywana dynamicznie w czasie rzeczywistym, co pozwala systemowi dostosować się do zmieniających się wzorców obciążenia w czasie.
  • Ochrona kondycji wystąpienia: środowisko uruchomieniowe ogranicza współbieżność do poziomów, które wystąpienie aplikacji funkcji może wygodnie obsłużyć. Te limity chronią aplikację przed przeciążeniem, wykonując więcej pracy niż powinna.
  • Zwiększona przepływność: ogólna przepływność jest ulepszona, ponieważ poszczególne wystąpienia nie ściągają większej ilości pracy niż mogą szybko przetwarzać. W związku z tym praca jest bardziej efektywnie rozkładana między instancjami. W przypadku funkcji, które mogą obsługiwać wyższe obciążenia, można uzyskać większą przepływność przez zwiększenie współbieżności do wartości powyżej konfiguracji domyślnej.

Konfiguracja współbieżności dynamicznej

Możesz włączyć współbieżność dynamiczną na poziomie hosta w pliku host.json . Po włączeniu poziom współbieżności wszystkich rozszerzeń powiązań, które obsługują tę funkcję, są automatycznie dostosowywane zgodnie z potrzebami. W takich przypadkach ustawienia dynamicznej współbieżności zastępują wszystkie ręcznie skonfigurowane ustawienia współbieżności.

Domyślnie współbieżność dynamiczna jest wyłączona. Po włączeniu współbieżności dynamicznej współbieżność rozpoczyna się na poziomie jednego dla każdej funkcji. Poziom współbieżności jest dostosowywany do optymalnej wartości, którą określa host.

Możesz włączyć dynamiczną współbieżność w aplikacji funkcji, dodając następujące ustawienia do pliku host.json :

    { 
        "version": "2.0", 
        "concurrency": { 
            "dynamicConcurrencyEnabled": true, 
            "snapshotPersistenceEnabled": true 
        } 
    } 

Gdy snapshotPersistenceEnabled jest wartością domyślną, nauczone wartości współbieżności są okresowo utrwalane w magazynie danych. Nowe wystąpienia zaczynają się od tych wartości, a nie od poziomu jednego i konieczności rozpoczynania nauki od nowa.

Menedżer współbieżności

Za kulisami, gdy dynamiczna współbieżność jest włączona, proces menedżera współbieżności działa w tle. Ten menedżer stale monitoruje metryki kondycji wystąpienia, takie jak wykorzystanie procesora CPU i wątku, oraz w razie potrzeby zmienia ograniczenia przepustowości. Po włączeniu co najmniej jednej przepustnicy współbieżność funkcji jest dostosowywana, dopóki host znów nie będzie w dobrej kondycji. Po wyłączeniu mechanizmów ograniczania przepustowości współbieżność może wzrosnąć. Różne heurystyki służą do inteligentnego dostosowywania współbieżności w górę lub w dół zgodnie z potrzebami na podstawie tych ograniczeń. Wraz z upływem czasu współbieżność każdej funkcji stabilizuje się na określonym poziomie. Ponieważ określenie optymalnej wartości współbieżności może zająć trochę czasu, należy użyć współbieżności dynamicznej tylko wtedy, gdy wartość nieoptymalna jest akceptowalna dla rozwiązania początkowo lub po okresie braku aktywności.

Poziomy współbieżności są zarządzane dla każdej funkcji. W szczególności system równoważy równowagę między funkcjami intensywnie korzystającymi z zasobów, które wymagają niskiego poziomu współbieżności i bardziej lekkich funkcji, które mogą obsługiwać większą współbieżność. Równowaga współbieżności dla każdej funkcji pomaga w utrzymaniu ogólnej kondycji instancji aplikacji funkcji.

W dziennikach można znaleźć decyzje dotyczące dynamicznej współbieżności, gdy dynamiczna współbieżność jest włączona. Na przykład wpisy dziennika są dodawane, gdy są włączane różne regulatory, a za każdym razem, gdy współbieżność jest dostosowywana w górę lub w dół dla każdej funkcji. Te logi są zapisywane w kategorii logów Host.Concurrency w tabeli traces.

Obsługa rozszerzeń

Dynamiczna współbieżność jest włączona dla aplikacji funkcji na poziomie hosta, a wszystkie rozszerzenia obsługujące dynamiczną współbieżność są uruchamiane w tym trybie. Współbieżność dynamiczna wymaga współpracy między hostem a poszczególnymi rozszerzeniami wyzwalacza. Tylko wymienione wersje następujących rozszerzeń obsługują współbieżność dynamiczną.

Numer wewnętrzny Wersja opis
Magazynowanie Kolejki Wersja 5.x (rozszerzenie pamięci) Wyzwalacz usługi Queue Storage ma własną pętlę sondowania wiadomości. Jeśli używasz stałej konfiguracji dla wystąpienia, BatchSize opcje konfiguracji i NewBatchThreshold zarządzają współbieżnością. W przypadku korzystania z dynamicznej współbieżności te wartości konfiguracji są ignorowane. Współbieżność dynamiczna jest zintegrowana z pętlą komunikatów, więc liczba komunikatów pobranych na iterację jest dynamicznie dostosowywana. Gdy ograniczanie jest włączone, to host jest przeciążony. Przetwarzanie komunikatów jest wstrzymane, dopóki ograniczniki nie zostaną wyłączone. Gdy regulatory są wyłączone, zwiększa się współbieżność.
Blob Storage Wersja 5.x (rozszerzenie pamięci) Wewnętrznie wyzwalacz usługi Blob Storage używa tej samej infrastruktury, z którą korzysta wyzwalacz usługi Queue Storage. Gdy nowe lub zaktualizowane obiekty blob wymagają przetworzenia, komunikaty są zapisywane w kontrolowanej przez platformę kolejce sterowania. Ta kolejka jest przetwarzana przy użyciu tej samej logiki używanej dla wyzwalacza usługi Queue Storage. Po włączeniu dynamicznej współbieżności współbieżność na potrzeby przetwarzania tej kolejki sterowania jest dynamicznie zarządzana.
Magistrala usług Wersja 5.x Wyzwalacz usługi Service Bus obsługuje obecnie trzy modele wykonywania. Współbieżność dynamiczna wpływa na te modele wykonywania w następujący sposób:
  • Przetwarzanie pojedynczego tematu/kolejki: Każde wywołanie funkcji przetwarza pojedynczy komunikat. W przypadku używania stałej konfiguracji dla poszczególnych wystąpień MaxConcurrentCalls opcja konfiguracji kontroluje współbieżność. W przypadku korzystania z dynamicznej współbieżności ta wartość konfiguracji jest ignorowana, a współbieżność jest dostosowywana dynamicznie.
  • Przetwarzanie pojedynczego tematu/kolejki opartego na sesji: każde wywołanie funkcji przetwarza pojedynczy komunikat. W zależności od liczby aktywnych sesji dla tematu lub kolejki każda instancja dzierżawi jedną lub więcej sesji. Komunikaty w każdej sesji są przetwarzane szeregowo, aby zagwarantować kolejność w sesji. Jeśli nie używasz współbieżności dynamicznej, MaxConcurrentSessions ustawienie zarządza współbieżnością. Po włączeniu dynamicznej współbieżności, wartość MaxConcurrentSessions jest pomijana, a liczba sesji przetwarzanych przez każde wystąpienie jest dynamicznie dostosowywana.
  • Przetwarzanie wsadowe: każde wywołanie funkcji przetwarza partię komunikatów podlegających ustawieniu MaxMessageCount . Ponieważ wywołania wsadowe są szeregowe, współbieżność dla funkcji wyzwalanej wsadowo jest zawsze jedna, a współbieżność dynamiczna nie ma zastosowania.
  • Następne kroki

    Aby uzyskać więcej informacji, zobacz następujące zasoby: