Współbieżność w Azure Functions
W tym artykule opisano zachowania współbieżności wyzwalaczy sterowanych zdarzeniami w Azure Functions. W tym artykule opisano 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ółdzielą te same zasoby obliczeniowe maszyny wirtualnej, takie jak pamięć, procesor CPU i połączenia. Gdy aplikacja jest hostowana w planie dynamicznym (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 oparte na zdarzeniach. Podczas hostowania funkcji w planie dedykowanego (App Service) należy ręcznie skonfigurować wystąpienia lub skonfigurować schemat autoskalowania.
Ponieważ wywołania wielu funkcji mogą być uruchamiane jednocześnie w każdym wystąpieniu, każda funkcja musi mieć możliwość ograniczenia liczby współbieżnych wywołań przetwarzania 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 dla danego typu wyzwalacza na wystąpienie. 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łania 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 dla 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ć 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, trudno jest określić optymalne 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 w przypadku określenia zestawu wartości, które działają dla określonego profilu obciążenia, liczba zdarzeń przychodzących z połączonych usług może ulec zmianie od dnia do dnia. 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 zezwalał wystąpieniom na przetwarzanie tak dużej ilości pracy, jak to możliwe, przy jednoczesnym zachowaniu niskiej kondycji i opóźnień każdego wystąpienia, 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 dla wyzwalaczy usługi Azure Blob, Azure Queue i Service Bus oraz wymaga użycia wersji wymienionych w poniższej sekcji pomocy technicznej rozszerzenia.
Korzyści
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 lub w dół, 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ługiwać. Chroni to aplikację przed przeciążeniem się, wykonując więcej pracy niż powinno.
- Ulepszona przepływność: ogólna przepływność została ulepszona, ponieważ poszczególne wystąpienia nie ściągają większej ilości pracy niż mogą szybko przetwarzać. Pozwala to na bardziej efektywne 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 dynamicznej współbieżności
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 współbieżność dynamiczną.
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ć współbieżność dynamiczną w aplikacji funkcji, dodając następujące ustawienia w pliku host.json:
{
"version": "2.0",
"concurrency": {
"dynamicConcurrencyEnabled": true,
"snapshotPersistenceEnabled": true
}
}
Gdy SnapshotPersistenceEnabled
jest to true
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 zamiast od 1 i muszą ponownie przeprowadzić naukę.
Menedżer współbieżności
W tle, gdy włączono dynamiczną 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 zmiany ograniczania w razie potrzeby. Po włączeniu co najmniej jednego ograniczenia współbieżność funkcji jest dostosowywana do momentu ponownego uruchomienia hosta w dobrej kondycji. 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 lekkich 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, a 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 śladów.
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 ograniczeń (host jest przeciążony), przetwarzanie komunikatów zostanie wstrzymane do momentu wyłączenia ograniczeń. Gdy ograniczenia są wyłączone, współbieżność wzrośnie.
Aby korzystać z 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 do kolejkiTrigger. Po włączeniu dynamicznej współbieżności współbieżność przetwarzania tej kolejki sterującej będzie dynamicznie zarządzana.
Aby użyć 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 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 korzystania ze statycznej konfiguracji współbieżność podlega opcji konfiguracji MaxConcurrentCalls. 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
MaxConcurrentSessions
ustawieniu. Po włączeniuMaxConcurrentSessions
dynamicznej współbieżności jest ignorowana, 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 włączyć 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
Więcej informacji można znaleźć w następujących zasobach: