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. Opisano w nim również nowy dynamiczny model optymalizacji zachowań współbieżności.

Model hostingu dla usługi Functions umożliwia współbieżne uruchamianie wielu wywołań funkcji w jednym wystąpieniu obliczeniowym. Rozważmy na przykład przypadek, w którym masz trzy różne funkcje w aplikacji funkcji, która jest skalowana w poziomie i działa w wielu wystąpieniach. W tym scenariuszu każda funkcja przetwarza wywołania w każdym wystąpieniu maszyny wirtualnej, na którym działa aplikacja funkcji. Wywołania funkcji w jednym wystąpieniu współużytkuje te same zasoby obliczeniowe maszyny wirtualnej, takie jak pamięć, procesor CPU i połączenia. Gdy aplikacja jest hostowana w ramach planu dynamicznego (Zużycie lub Premium), platforma 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) można ręcznie skonfigurować wystąpienia lub skonfigurować schemat skalowania automatycznego.

Ponieważ wiele wywołań funkcji może być uruchamianych jednocześnie na każdym wystąpieniu, każda funkcja musi mieć możliwość ograniczenia liczby współbieżnych wywołań, które przetwarza w danym momencie.

Współbieżność statyczna

Wiele wyzwalaczy obsługuje statyczny model konfiguracji na poziomie hosta, który służy do określania współbieżności poszczególnych wystąpień dla tego typu wyzwalacza. 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 istnieje domyślne zachowanie, które można zastąpić w pliku host.json aplikacji funkcji. Te ustawienia, które mają zastosowanie do wszystkich uruchomionych wystąpień, umożliwiają kontrolowanie maksymalnej współbieżności dla 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ń. 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.

Chociaż takie 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ć dopuszczalne wartości za pośrednictwem procesu próbnego i błędu testowania obciążenia. Nawet jeśli określisz zestaw 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, współbieżność można zwiększyć do wartości wykraczających poza domyślne wartości konfiguracji, co daje większą przepływność.

Konfiguracja współbieżności dynamicznej

Współbieżność dynamiczna można włączyć na poziomie hosta w pliku host.json. Po włączeniu wszystkich rozszerzeń powiązań używanych przez aplikację funkcji, które obsługują dynamiczne współbieżność, dynamicznie dostosowuje współbieżność zgodnie z potrzebami. Dynamiczne ustawienia współbieżności zastępują wszystkie ręcznie skonfigurowane ustawienia współbieżności dla wyzwalaczy obsługujących dynamiczną współbieżność.

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ą.

Azure Queues

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ę.

Aby używać dynamicznej współbieżności dla kolejek, należy użyć wersji 5.x rozszerzenia magazynu.

Obiekty blob platformy Azure

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.

Aby używać współbieżności dynamicznej dla obiektów blob, należy użyć wersji 5.x rozszerzenia magazynu.

Service Bus

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 pojedynczy 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. Jeśli nie używasz współbieżności dynamicznej, 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.

Aby umożliwić wyzwalacz usługi Service Bus do korzystania z dynamicznej współbieżności, należy użyć wersji 5.x rozszerzenia usługi Service Bus.

Następne kroki

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