Udostępnij za pośrednictwem


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

W tym artykule opisano zachowania współbieżności wyzwalaczy sterowanych zdarzeniami w usłudze Azure Functions. Porównuje również modele statyczne i dynamiczne współbieżności.

W usłudze Functions można mieć wiele procesów wykonywania danej funkcji uruchomionej współbieżnie w jednym wystąpieniu obliczeniowym. Rozważmy na przykład przypadek, w którym masz trzy różne funkcje w aplikacji funkcji, które są skalowane w poziomie do wielu wystąpień w celu obsługi zwiększonego obciążenia. W tym scenariuszu każda funkcja jest wykonywana w odpowiedzi na poszczególne wywołania we wszystkich trzech wystąpieniach, a dane wystąpienie może obsługiwać wiele wywołań tego samego typu. Należy pamiętać, że wykonywanie funkcji w jednym wystąpieniu współużytkuje tę samą pamięć, procesor CPU i zasoby połączenia. Ponieważ wiele wykonań funkcji może być uruchamianych jednocześnie na każdym wystąpieniu, każda funkcja musi mieć możliwość zarządzania liczbą współbieżnych wykonań.

Gdy aplikacja jest hostowana w planie skalowania dynamicznego (Zużycie, Flex Consumption lub Premium), host skaluje liczbę wystąpień aplikacji funkcji w górę lub w dół na podstawie liczby zdarzeń przychodzących. Aby dowiedzieć się więcej, zobacz Skalowanie sterowane zdarzeniami. W przypadku hostowania funkcji w ramach planu dedykowanego (App Service) należy ręcznie skonfigurować wystąpienia lub skonfigurować schemat skalowania automatycznego.

Te decyzje dotyczące skalowania mają również bezpośredni wpływ na współbieżność wykonań w danym wystąpieniu. 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.

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

  • Współbieżność statyczna: można skonfigurować limity na poziomie hosta w współbieżności, które są specyficzne dla poszczególnych wyzwalaczy. Jest to domyślne zachowanie 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. Musisz wyrazić zgodę na ten model współbieżności.

Współbieżność statyczna

Domyślnie większość wyzwalaczy obsługuje statyczny model konfiguracji na poziomie hosta. W tym modelu każdy typ wyzwalacza ma limit współbieżności dla wystąpienia. Jednak w przypadku większości wyzwalaczy można również zażądać określonej współbieżności dla danego typu wyzwalacza dla danego wystąpienia. Na przykład wyzwalacz usługi Service Bus udostępnia zarówno ustawienie, jak MaxConcurrentCalls i MaxConcurrentSessions w pliku host.json. Te ustawienia razem kontrolują maksymalną liczbę komunikatów, które każda funkcja przetwarza jednocześnie w każdym wystąpieniu. Inne typy wyzwalaczy mają wbudowane mechanizmy wywoływania równoważenia obciążenia między wystąpieniami. Na przykład usługi 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 wybrane ustawienia są stosowane do wszystkich uruchomionych wystąpień. Dzięki temu można kontrolować maksymalną współbieżność funkcji w każdym wystąpieniu. Na przykład gdy funkcja jest intensywnie obciążana procesorem CPU lub zasobami, możesz ograniczyć współbieżność, aby zachować dobrą kondycję wystąpień i 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 (wersja zapoznawcza)

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 wyzwalaczy HTTP w danym wystąpieniu na podstawie skonfigurowanego rozmiaru pamięci wystąpienia.

Rozmiar wystąpienia (MB) Domyślna współbieżność*
2048 16
4096 32

*W przypadku aplikacji języka Python domyślna współbieżność wyzwalacza HTTP dla wszystkich rozmiarów wystąpień to 1.

Te wartości domyślne powinny działać dobrze w większości przypadków i zaczynasz 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 ustawiono własnego ustawienia współbieżności HTTP. Jeśli nie ustawiono 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 statycznej

Podczas gdy statyczne konfiguracje współbieżności zapewniają kontrolę nad pewnymi zachowaniami wyzwalacza, takimi jak ograniczanie funkcji, może być trudne do określenia optymalnych wartości dla tych ustawień. 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ń przychodzących z połączonych usług może ulec zmianie z dnia na dzień. Ta zmienność oznacza, że aplikacja często może działać z nieoptymalnymi wartościami. Na przykład aplikacja funkcji może przetwarzać szczególnie wymagające ładunki komunikatów w ostatnim dniu tygodnia, co wymaga ograniczenia współbieżności. Jednak w pozostałej części tygodnia ładunki komunikatów są prostsze, co oznacza, że można użyć wyższego poziomu współbieżności w pozostałej części tygodnia.

W idealnym przypadku chcemy, aby system umożliwiał wystąpieniom przetwarzanie tak dużej ilości pracy, jak to możliwe, przy zachowaniu niskiej kondycji każdego wystąpienia i małych opóźnień, co jest przeznaczone do dynamicznej współbieżności.

Współbieżność dynamiczna

Usługa Functions udostępnia teraz dynamiczny model współbieżności, który upraszcza konfigurowanie współbieżności dla wszystkich aplikacji funkcji działających w tym samym planie.

Uwaga

Współbieżność dynamiczna jest obecnie obsługiwana tylko w przypadku wyzwalaczy usługi Azure Blob, Azure Queue i Service Bus oraz wymaga użycia wersji wymienionych w poniższej sekcji obsługi rozszerzeń.

Świadczenia

Korzystanie z dynamicznej współbieżności 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ć. Chroni to aplikację przed przeciążeniem, wykonując więcej pracy niż powinna.
  • Ulepszona przepływność: ogólna przepływność jest lepsza, ponieważ poszczególne wystąpienia nie ściągają większej ilości pracy niż mogą szybko przetwarzać. Umożliwia to wydajniejsze równoważenie obciążenia między wystąpieniami. 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

Współbieżność dynamiczna można włączyć na poziomie hosta w pliku host.json. Po włączeniu poziom współbieżności wszelkich 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 dynamicznej współbieżności współbieżność rozpoczyna się od 1 dla każdej funkcji i jest dostosowywana do optymalnej wartości, która jest określana przez hosta.

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

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

Gdy SnapshotPersistenceEnabled jest trueto wartość domyślna, poznane wartości współbieżności są okresowo utrwalane w magazynie, więc nowe wystąpienia zaczynają się od tych wartości, a nie od 1 i muszą ponownie przeprowadzić naukę.

Menedżer współbieżności

W tle, gdy włączona jest dynamiczna współbieżność, w tle jest uruchomiony proces menedżera współbieżności. 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 jednego ograniczenia współbieżność funkcji zostanie skorygowana do momentu ponownego włączenia kondycji hosta. Gdy ograniczenia są wyłączone, 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.

Poziomy współbieżności są zarządzane dla każdej funkcji. W związku z tym 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 uproszczonych funkcji, które mogą obsługiwać większą współbieżność. Równowaga współbieżności dla każdej funkcji pomaga zachować ogólną kondycję wystąpienia aplikacji funkcji.

Po włączeniu dynamicznej współbieżności w dziennikach będą widoczne dynamiczne decyzje współbieżności. Na przykład zobaczysz dzienniki, gdy są włączone różne ograniczenia, i za każdym razem, gdy współbieżność jest dostosowywana w górę lub w dół dla każdej funkcji. Te dzienniki są zapisywane w kategorii dziennikó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
Queue Storage wersja 5.x (rozszerzenie magazynu) Wyzwalacz usługi Azure Queue Storage ma własną pętlę sondowania komunikatów. W przypadku korzystania ze statycznej konfiguracji współbieżność podlega opcjom BatchSize/NewBatchThreshold konfiguracji. W przypadku korzystania z dynamicznej współbieżności te wartości konfiguracji są ignorowane. Dynamiczna współbieżność jest zintegrowana z pętlą komunikatów, więc liczba komunikatów pobieranych na iterację jest dynamicznie dostosowywana. Po włączeniu ograniczania (host jest przeciążony), przetwarzanie komunikatów zostanie wstrzymane do momentu wyłączenia ograniczeń. Gdy ograniczenia są wyłączone, współbieżność zwiększy się.
Blob Storage wersja 5.x (rozszerzenie magazynu) Wewnętrznie wyzwalacz usługi Azure Blob Storage używa tej samej infrastruktury, z którą korzysta wyzwalacz kolejki platformy Azure. Gdy należy przetworzyć nowe/zaktualizowane obiekty blob, komunikaty są zapisywane w kolejce sterowania zarządzanej przez platformę, a kolejka jest przetwarzana przy użyciu tej samej logiki używanej w przypadku kolejkiTrigger. Po włączeniu dynamicznej współbieżności współbieżność na potrzeby przetwarzania tej kolejki sterowania będzie dynamicznie zarządzana.
Service Bus wersja 5.x Wyzwalacz usługi Service Bus obsługuje obecnie trzy modele wykonywania. Współbieżność dynamiczna ma wpływ na te modele wykonywania w następujący sposób:

Przetwarzanie pojedynczego tematu/kolejki: każde wywołanie funkcji przetwarza jeden komunikat. W przypadku korzystania ze statycznej konfiguracji współbieżność podlega MaxConcurrentCalls opcji konfiguracji. 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 jeden komunikat. W zależności od liczby aktywnych sesji dla tematu/kolejki każde wystąpienie dzierżawi co najmniej jedną sesję. Komunikaty w każdej sesji są przetwarzane szeregowo, aby zagwarantować kolejność w sesji. Gdy współbieżność dynamiczna nie jest używana, współbieżność podlega ustawieniu MaxConcurrentSessions . W przypadku włączonej dynamicznej współbieżności jest ignorowana, MaxConcurrentSessions a liczba sesji, które przetwarza 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ść 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: