Wskazówki dotyczące wydajności i skalowania dla usług Event Hubs i Azure Functions

Azure Event Hubs
Azure Functions

Ten artykuł zawiera wskazówki dotyczące optymalizacji skalowalności i wydajności podczas używania Azure Event Hubs i Azure Functions razem w aplikacjach.

Grupowanie funkcji

Zazwyczaj funkcja hermetyzuje jednostkę pracy w strumieniu przetwarzania zdarzeń. Na przykład funkcja może przekształcić zdarzenie w nową strukturę danych lub wzbogacić dane dla aplikacji podrzędnych.

W usłudze Functions aplikacja funkcji udostępnia kontekst wykonywania funkcji. Zachowania aplikacji funkcji mają zastosowanie do wszystkich funkcji hostujących aplikację funkcji. Funkcje w aplikacji funkcji są wdrażane razem i skalowane razem. Wszystkie funkcje w aplikacji funkcji muszą być w tym samym języku.

Sposób grupowania funkcji w aplikacje funkcji może mieć wpływ na wydajność i możliwości skalowania aplikacji funkcji. Można grupować zgodnie z prawami dostępu, wdrażaniem i wzorcami użycia, które wywołują kod.

Aby uzyskać wskazówki dotyczące najlepszych rozwiązań dotyczących grupowania i innych aspektów, zobacz Najlepsze rozwiązania dotyczące niezawodnych Azure Functions i Poprawianie wydajności i niezawodności Azure Functions.

Poniższa lista zawiera wskazówki dotyczące funkcji grupowania. Wskazówki obejmują aspekty magazynu i grupy odbiorców:

  • Hostowanie pojedynczej funkcji w aplikacji funkcji: Jeśli usługa Event Hubs wyzwala funkcję, możesz zmniejszyć rywalizację między nią a innymi funkcjami, odizolować funkcję we własnej aplikacji funkcji. Izolacja jest szczególnie ważna, jeśli inne funkcje intensywnie korzystają z procesora CPU lub pamięci. Ta technika pomaga, ponieważ każda funkcja ma własne ślady pamięci i wzorce użycia, które mogą bezpośrednio wpłynąć na skalowanie aplikacji funkcji, która ją hostuje.

  • Nadaj każdej aplikacji funkcji własne konto magazynu: Unikaj udostępniania kont magazynu między aplikacjami funkcji. Ponadto jeśli aplikacja funkcji używa konta magazynu, nie używaj tego konta na potrzeby innych operacji magazynu ani potrzeb. Może to być szczególnie ważne, aby uniknąć udostępniania kont magazynu dla funkcji wyzwalanych przez usługę Event Hubs, ponieważ takie funkcje mogą mieć dużą liczbę transakcji magazynu z powodu tworzenia punktów kontrolnych.

  • Utwórz dedykowaną grupę odbiorców dla każdej aplikacji funkcji: Grupa odbiorców jest widokiem centrum zdarzeń. Różne grupy odbiorców mają różne widoki, co oznacza, że stany, pozycje i przesunięcia mogą się różnić. Grupy odbiorców umożliwiają wielu aplikacjom zużywających dostęp do własnych widoków strumienia zdarzeń oraz niezależne odczytywanie strumienia we własnym tempie i z własnymi przesunięciami. Aby uzyskać więcej informacji na temat grup odbiorców, zobacz Funkcje i terminologia w Azure Event Hubs.

    Grupa odbiorców ma skojarzoną co najmniej jedną aplikację dla konsumentów, a aplikacja konsumenta może używać co najmniej jednej grupy odbiorców. W rozwiązaniu do przetwarzania strumieniowego każda aplikacja odbiorcy jest równa grupie odbiorców. Aplikacja funkcji jest doskonałym przykładem aplikacji konsumenckiej. Na poniższym diagramie przedstawiono przykład dwóch aplikacji funkcji odczytywanych z centrum zdarzeń, gdzie każda aplikacja ma własną dedykowaną grupę odbiorców:

    Dedykowane grupy odbiorców dla każdej aplikacji funkcji

    Nie udostępniaj grup odbiorców między aplikacjami funkcji i innymi aplikacjami konsumenckimi. Każda aplikacja funkcji powinna być odrębną aplikacją z własną przypisaną grupą odbiorców, aby zapewnić integralność przesunięcia dla każdego użytkownika i uprościć zależności w architekturze przesyłania strumieniowego zdarzeń. Taka konfiguracja, wraz z zapewnieniem każdej funkcji wyzwalanej przez centrum zdarzeń własną aplikacją funkcji i kontem magazynu, pomaga ustawić podstawę optymalnej wydajności i skalowania.

Plany hostingu funkcji

Każda aplikacja funkcji jest hostowana zgodnie z jednym z trzech planów hostingu. Aby uzyskać informacje o tych planach, zobacz Azure Functions opcje hostingu. Zwróć uwagę na sposób skalowania trzech opcji.

Plan Zużycie jest domyślny. Aplikacje funkcji w planie Zużycie są skalowane niezależnie i są najbardziej skuteczne, gdy unikają długotrwałych zadań.

Plany Premium i Dedykowane są często używane do hostowania wielu aplikacji funkcji i funkcji, które są bardziej intensywnie obciążające procesor CPU i pamięć. W przypadku planu dedykowanego funkcje są uruchamiane w ramach planu Azure App Service w regularnych stawkach planu App Service. Należy pamiętać, że wszystkie aplikacje funkcji w tych planach współdzielą zasoby przydzielone do planu. Jeśli funkcje mają różne profile obciążenia lub unikatowe wymagania, najlepiej hostować je w różnych planach, zwłaszcza w aplikacjach do przetwarzania strumieniowego.

Skalowanie usługi Event Hubs

Podczas wdrażania przestrzeni nazw usługi Event Hubs istnieje kilka ważnych ustawień, które należy ustawić prawidłowo, aby zapewnić szczytową wydajność i skalowanie. Ta sekcja koncentruje się na warstwie Standardowa usługi Event Hubs i unikatowych funkcjach tej warstwy, które mają wpływ na skalowanie podczas korzystania z usługi Functions. Aby uzyskać więcej informacji na temat warstw usługi Event Hubs, zobacz Warstwy podstawowa a Standardowa a Premium a Dedykowana.

Przestrzeń nazw usługi Event Hubs odpowiada klastrowi platformy Kafka. Aby uzyskać informacje na temat relacji usług Event Hubs i Kafka ze sobą, zobacz Co to jest Azure Event Hubs dla platformy Apache Kafka.

Informacje o jednostkach przepływności (TU)

W warstwie Standardowa usługi Event Hubs przepływność jest klasyfikowana jako ilość danych wprowadzona i odczytywana z przestrzeni nazw na jednostkę czasu. Jednostki TU to wstępnie zakupione jednostki pojemności przepływności.

Jednostki TU są rozliczane godzinowo.

Wszystkie centra zdarzeń w przestrzeni nazw współużytkuje jednostki TU. Aby prawidłowo obliczyć potrzeby dotyczące pojemności, należy wziąć pod uwagę wszystkie aplikacje i usługi, zarówno wydawców, jak i użytkowników. Funkcje wpływają na liczbę bajtów i zdarzeń publikowanych w centrum zdarzeń i odczytywanych z tego centrum zdarzeń.

Nacisk na określenie liczby jednostek TU znajduje się w punkcie ruchu przychodzącego. Jednak agregacja dla aplikacji konsumenckich, w tym szybkość przetwarzania tych zdarzeń, również musi zostać uwzględniona w obliczeniu.

Aby uzyskać więcej informacji o jednostkach przepływności usługi Event Hubs, zobacz Jednostki przepływności.

Skalowanie w górę za pomocą autopompowania

Automatyczne rozszerzanie można włączyć w przestrzeni nazw usługi Event Hubs, aby uwzględnić sytuacje, w których obciążenie przekracza skonfigurowaną liczbę jednostek RU. Użycie automatycznego rozszerzania zapobiega ograniczaniu przepustowości aplikacji i pomaga zapewnić, że przetwarzanie, w tym pozyskiwanie zdarzeń, będzie kontynuowane bez zakłóceń. Ponieważ ustawienie tu wpływa na koszty, użycie automatycznego rozszerzania pomaga rozwiązać problemy związane z nadmierną aprowizowaniem.

Automatyczne rozszerzanie to funkcja usługi Event Hubs, która często jest mylona z autoskalowaniem, zwłaszcza w kontekście rozwiązań bezserwerowych. Jednak automatyczne rozszerzanie, w przeciwieństwie do autoskalowania, nie jest skalowane w dół, gdy dodatkowa pojemność nie jest już potrzebna.

Jeśli aplikacja potrzebuje pojemności przekraczającej maksymalną dozwoloną liczbę jednostek RU, rozważ użycie warstwy Premium usługi Event Hubs lub warstwy dedykowanej.

Partycje i funkcje współbieżne

Po utworzeniu centrum zdarzeń należy określić liczbę partycji . Liczba partycji pozostaje stała i nie można jej zmienić z wyjątkiem warstw Premium i Dedykowane. Gdy usługa Event Hubs wyzwala aplikacje funkcji, możliwe jest, że liczba współbieżnych wystąpień może być równa liczbie partycji.

W planach hostingu Zużycie i Premium wystąpienia aplikacji funkcji są dynamicznie skalowane w poziomie w celu spełnienia liczby partycji, jeśli jest to konieczne. Dedykowany plan hostingu uruchamia funkcje w planie App Service i wymaga ręcznego skonfigurowania wystąpień lub skonfigurowania schematu skalowania automatycznego. Aby uzyskać więcej informacji, zobacz Dedykowane plany hostingu dla Azure Functions.

Ostatecznie relacja "jeden do jednego" między liczbą partycji a wystąpieniami aplikacji funkcji jest idealnym celem maksymalnej przepływności w rozwiązaniu do przetwarzania strumieniowego. Aby osiągnąć optymalną równoległość, należy mieć wielu odbiorców w grupie odbiorców. W przypadku usługi Functions ten cel przekłada się na wiele wystąpień aplikacji funkcji w planie. Wynik jest określany jako równoległość na poziomie partycji lub maksymalny stopień równoległości, jak pokazano na poniższym diagramie:

Maksymalny stopień równoległości

Może się wydawać, że warto skonfigurować jak najwięcej partycji, aby osiągnąć maksymalną przepływność i uwzględnić możliwość wystąpienia większej liczby zdarzeń. Istnieje jednak kilka ważnych czynników, które należy wziąć pod uwagę podczas konfigurowania wielu partycji:

  • Więcej partycji może prowadzić do większej przepływności: Ponieważ stopień równoległości jest liczbą użytkowników (wystąpień aplikacji funkcji), tym większa jest liczba dostępnych partycji, tym większa może być współbieżna przepływność. Ten fakt jest ważny w przypadku udostępnienia wyznaczonej liczby jednostek ru dla centrum zdarzeń innym aplikacjom konsumenckim.
  • Więcej funkcji może wymagać większej ilości pamięci: Wraz ze wzrostem liczby wystąpień aplikacji funkcji zużycie pamięci zasobów w planie. W pewnym momencie zbyt wiele partycji może pogorszyć wydajność dla użytkowników.
  • Istnieje ryzyko wystąpienia presji zwrotnej ze strony usług podrzędnych: W miarę generowania większej przepływności ryzykujesz przeciążenia usług podrzędnych lub odbierasz od nich presję zwrotną. Podczas rozważania konsekwencji związanych z otaczającymi zasobami należy uwzględnić fan-out konsumentów. Możliwe konsekwencje obejmowały ograniczanie przepustowości z innych usług, nasycenie sieci i inne formy rywalizacji o zasoby.
  • Partycje mogą być wypełniane rzadko: Połączenie wielu partycji i małej liczby zdarzeń może prowadzić do rozrzedzonych danych między partycjami. Zamiast tego mniejsza liczba partycji może zapewnić lepszą wydajność i użycie zasobów

Dostępność i spójność

Jeśli klucz partycji lub identyfikator nie zostanie określony, usługa Event Hubs kieruje zdarzenie przychodzące do następnej dostępnej partycji. Ta praktyka zapewnia wysoką dostępność i pomaga zwiększyć przepływność dla użytkowników.

Podczas określania kolejności zestawu zdarzeń producent zdarzeń może określić, że określona partycja ma być używana dla wszystkich zdarzeń zestawu. Aplikacja konsumenta, która odczytuje z partycji, odbiera zdarzenia w odpowiedniej kolejności. Ta kompromis zapewnia spójność, ale narusza dostępność. Nie należy używać tej metody, chyba że należy zachować kolejność zdarzeń.

W przypadku usługi Functions kolejność jest osiągana, gdy zdarzenia są publikowane w określonej partycji, a wyzwolona funkcja usługi Event Hubs uzyskuje dzierżawę dla tej samej partycji. Obecnie możliwość skonfigurowania partycji za pomocą powiązania wyjściowego usługi Event Hubs nie jest obsługiwana. Zamiast tego najlepszym rozwiązaniem jest użycie jednego z zestawów SDK usługi Event Hubs do opublikowania w określonej partycji.

Aby uzyskać więcej informacji o tym, jak usługa Event Hubs obsługuje dostępność i spójność, zobacz Dostępność i spójność w usłudze Event Hubs.

Wyzwalacz usługi Event Hubs

Ta sekcja koncentruje się na ustawieniach i zagadnieniach dotyczących optymalizowania funkcji wyzwalanych przez usługę Event Hubs. Czynniki obejmują przetwarzanie wsadowe, próbkowanie i powiązane funkcje wpływające na zachowanie powiązania wyzwalacza centrum zdarzeń.

Przetwarzanie wsadowe dla wyzwolonych funkcji

Możesz skonfigurować funkcje wyzwalane przez centrum zdarzeń w celu przetworzenia partii zdarzeń lub jednego zdarzenia naraz. Przetwarzanie partii zdarzeń jest bardziej wydajne, ponieważ eliminuje niektóre obciążenia związane z wywołaniami funkcji. Jeśli nie musisz przetwarzać tylko jednego zdarzenia, funkcja powinna być skonfigurowana do przetwarzania wielu zdarzeń po wywołaniu.

Włączanie przetwarzania wsadowego dla powiązania wyzwalacza usługi Event Hubs różni się w zależności od języków:

  • Język JavaScript, Python i inne języki umożliwiają przetwarzanie wsadowe, gdy właściwość kardynalności jest ustawiona na wiele w pliku function.json dla funkcji.
  • W języku C# kardynalność jest automatycznie konfigurowana, gdy tablica jest wyznaczona dla typu w atrybucie EventHubTrigger .

Aby uzyskać więcej informacji na temat włączania wsadowania, zobacz wyzwalacz Azure Event Hubs dla Azure Functions.

Ustawienia wyzwalacza

Kilka ustawień konfiguracji w pliku host.json odgrywa kluczową rolę w cechach wydajności powiązania wyzwalacza usługi Event Hubs dla funkcji:

  • maxEventBatchSize: To ustawienie reprezentuje maksymalną liczbę zdarzeń, które funkcja może odbierać po wywołaniu. Jeśli liczba odebranych zdarzeń jest mniejsza niż ta kwota, funkcja jest nadal wywoływana z dowolną liczbą zdarzeń, które są dostępne. Nie można ustawić minimalnego rozmiaru partii.
  • prefetchCount: Liczba pobrań wstępnych jest jednym z najważniejszych ustawień podczas optymalizacji pod kątem wydajności. Podstawowy kanał AMQP odwołuje się do tej wartości, aby określić liczbę komunikatów do pobrania i pamięci podręcznej dla klienta. Liczba prefetch powinna być większa lub równa wartości maxEventBatchSize i jest często ustawiona na wielokrotność tej kwoty. Ustawienie tej wartości na liczbę mniejszą niż ustawienie maxEventBatchSize może zaszkodzić wydajności.
  • batchCheckpointFrequency: Gdy funkcja przetwarza partie, ta wartość określa szybkość tworzenia punktów kontrolnych. Wartość domyślna to 1, co oznacza, że punkt kontrolny jest zawsze, gdy funkcja pomyślnie przetwarza partię. Punkt kontrolny jest tworzony na poziomie partycji dla każdego czytelnika w grupie odbiorców. Aby uzyskać informacje o tym, jak to ustawienie wpływa na powtórki i ponawianie prób zdarzeń, zobacz Funkcja platformy Azure wyzwalana przez centrum zdarzeń: odtwarzanie i ponowne próby (wpis w blogu).

Wykonaj kilka testów wydajnościowych, aby określić wartości ustawione dla powiązania wyzwalacza. Zalecamy zmianę ustawień przyrostowo i spójną miarę, aby dostosować te opcje. Wartości domyślne są rozsądnym punktem wyjścia dla większości rozwiązań do przetwarzania zdarzeń.

Tworzenie punktów kontrolnych

Punkty kontrolne oznaczają lub zatwierdzają pozycje czytnika w sekwencji zdarzeń partycji. Jest to odpowiedzialność hosta usługi Functions za punkt kontrolny podczas przetwarzania zdarzeń, a ustawienie częstotliwości punktów kontrolnych wsadowych jest spełnione. Aby uzyskać więcej informacji na temat punktów kontrolnych, zobacz Funkcje i terminologia w Azure Event Hubs.

Poniższe pojęcia mogą pomóc zrozumieć relację między punktami kontrolnymi i sposobem przetwarzania zdarzeń przez funkcję:

  • Wyjątki nadal są liczone w kierunku powodzenia: Jeśli proces funkcji nie ulega awarii podczas przetwarzania zdarzeń, ukończenie funkcji jest uznawane za pomyślne, nawet jeśli wystąpiły wyjątki. Po zakończeniu działania funkcji host usługi Functions ocenia usługę batchCheckpointFrequency. Jeśli nadszedł czas na punkt kontrolny, tworzy jeden, niezależnie od tego, czy wystąpiły wyjątki. Fakt, że wyjątki nie mają wpływu na punkty kontrolne, nie powinny wpływać na właściwe użycie sprawdzania i obsługi wyjątków.
  • Częstotliwość wsadowa ma znaczenie: W rozwiązaniach do przesyłania strumieniowego zdarzeń o dużej ilości korzystne może być zmianę ustawienia batchCheckpointFrequency na wartość większą niż 1. Zwiększenie tej wartości może zmniejszyć szybkość tworzenia punktu kontrolnego i w konsekwencji liczbę operacji we/wy magazynu.
  • Powtórki mogą się zdarzyć: Za każdym razem, gdy funkcja jest wywoływana z powiązaniem wyzwalacza usługi Event Hubs, używa najnowszego punktu kontrolnego, aby określić, gdzie wznowić przetwarzanie. Przesunięcie dla każdego konsumenta jest zapisywane na poziomie partycji dla każdej grupy odbiorców. Powtórki występują, gdy punkt kontrolny nie występuje podczas ostatniego wywołania funkcji, a funkcja jest wywoływana ponownie. Aby uzyskać więcej informacji na temat zduplikowanych i technik deduplikacji, zobacz Idempotency ( Idempotency).

Zrozumienie punktów kontrolnych staje się krytyczne, gdy rozważasz najlepsze rozwiązania dotyczące obsługi błędów i ponawiania prób— temat omówiony w dalszej części tego artykułu.

Próbkowanie danych telemetrycznych

Funkcje zapewniają wbudowaną obsługę usługi Application Insights— rozszerzenie usługi Azure Monitor, które zapewnia możliwości monitorowania wydajności aplikacji. Dzięki tej funkcji można rejestrować informacje o działaniach funkcji, wydajności, wyjątkach środowiska uruchomieniowego i nie tylko. Aby uzyskać więcej informacji, zobacz Omówienie usługi Application Insights.

Ta zaawansowana funkcja oferuje niektóre kluczowe opcje konfiguracji, które wpływają na wydajność. Oto niektóre istotne ustawienia i zagadnienia dotyczące monitorowania i wydajności:

  • Włącz próbkowanie telemetrii: W przypadku scenariuszy o wysokiej przepływności należy ocenić ilość potrzebnych danych telemetrycznych i informacji. Rozważ użycie funkcji próbkowania telemetrii w usłudze Application Insights, aby uniknąć obniżenia wydajności funkcji przy użyciu niepotrzebnych danych telemetrycznych i metryk.
  • Konfigurowanie ustawień agregacji: Sprawdź i skonfiguruj częstotliwość agregowania i wysyłania danych do usługi Application Insights. To ustawienie konfiguracji znajduje się w pliku host.json wraz z wieloma innymi opcjami dotyczącymi próbkowania i rejestrowania. Aby uzyskać więcej informacji, zobacz Konfigurowanie agregatora.
  • Wyłącz pozycję AzureWebJobDashboard: W przypadku aplikacji docelowych w wersji 1.x środowiska uruchomieniowego usługi Functions to ustawienie przechowuje parametry połączenia z kontem magazynu używanym przez zestaw Azure SDK do przechowywania dzienników dla pulpitu nawigacyjnego zadań WebJobs. Jeśli usługa Application Insights jest używana zamiast pulpitu nawigacyjnego zadań WebJob, to to ustawienie powinno zostać usunięte. Aby uzyskać więcej informacji, zobacz AzureWebJobsDashboard.

Gdy usługa Application Insights jest włączona bez próbkowania, wszystkie dane telemetryczne są wysyłane. Wysyłanie danych o wszystkich zdarzeniach może mieć szkodliwy wpływ na wydajność funkcji, szczególnie w scenariuszach przesyłania strumieniowego zdarzeń o wysokiej przepływności.

Korzystanie z próbkowania i ciągłe ocenianie odpowiedniej ilości danych telemetrycznych potrzebnych do monitorowania ma kluczowe znaczenie dla optymalnej wydajności. Dane telemetryczne powinny być używane do ogólnej oceny kondycji platformy i okazjonalnych rozwiązywania problemów, a nie do przechwytywania podstawowych metryk biznesowych. Aby uzyskać więcej informacji, zobacz Konfigurowanie próbkowania.

Powiązanie wyjściowe

Użyj powiązania wyjściowego usługi Event Hubs dla Azure Functions, aby uprościć publikowanie w strumieniu zdarzeń z funkcji. Zalety korzystania z tego powiązania obejmują:

  • Zarządzanie zasobami: Powiązanie obsługuje zarówno cykl życia klienta, jak i połączenia, i zmniejsza potencjalne problemy, które mogą wystąpić w przypadku wyczerpania portów i zarządzania pulą połączeń.
  • Mniej kodu: Powiązanie abstrakcji bazowego zestawu SDK i zmniejsza ilość kodu potrzebnego do publikowania zdarzeń. Ułatwia pisanie kodu, który jest łatwiejszy do pisania i konserwacji.
  • Tworzenie pakietów wsadowych: W przypadku kilku języków przetwarzanie wsadowe jest obsługiwane w celu wydajnego publikowania w strumieniu zdarzeń. Przetwarzanie wsadowe może zwiększyć wydajność i usprawnić kod, który wysyła zdarzenia.

Zdecydowanie zalecamy przejrzenie listy języków obsługiwanych przez usługę Functions i przewodników dla deweloperów dla tych języków. Sekcja Powiązania dla każdego języka zawiera szczegółowe przykłady i dokumentację.

Przetwarzanie wsadowe podczas publikowania zdarzeń

Jeśli funkcja publikuje tylko jedno zdarzenie, skonfigurowanie powiązania w celu zwrócenia wartości jest typowym podejściem, które jest przydatne, jeśli wykonywanie funkcji zawsze kończy się instrukcją, która wysyła zdarzenie. Ta technika powinna być używana tylko w przypadku funkcji synchronicznych, które zwracają tylko jedno zdarzenie.

Wsadowanie jest zachęcane do zwiększenia wydajności podczas wysyłania wielu zdarzeń do strumienia. Przetwarzanie wsadowe umożliwia powiązanie publikowania zdarzeń w najbardziej wydajny możliwy sposób.

Obsługa używania powiązania wyjściowego do wysyłania wielu zdarzeń do usługi Event Hubs jest dostępna w języku C#, Java, Python i JavaScript.

Dane wyjściowe wielu zdarzeń (C#)

Użyj typów ICollector i IAsyncCollector podczas wysyłania wielu zdarzeń z funkcji w języku C#.

  • ICollector<T>. Metoda Add() może być używana zarówno w funkcjach synchronicznych, jak i asynchronicznych. Wykonuje operację dodawania zaraz po wywołaniu.
  • IAsyncCollector<T>. Metoda AddAsync() przygotowuje zdarzenia do opublikowania w strumieniu zdarzeń. Jeśli napiszesz funkcję asynchroniczną, użyj funkcji IAsyncCollector , aby lepiej zarządzać opublikowanymi zdarzeniami.

Przykłady użycia języka C# do publikowania pojedynczych i wielu zdarzeń można znaleźć w temacie Azure Event Hubs powiązanie danych wyjściowych dla Azure Functions.

Ograniczanie przepustowości i ciśnienie wsteczne

Zagadnienia dotyczące ograniczania przepustowości dotyczą powiązania danych wyjściowych nie tylko dla usługi Event Hubs, ale także dla usług platformy Azure, takich jak Azure Cosmos DB. Ważne jest, aby zapoznać się z limitami i limitami przydziałów, które mają zastosowanie do tych usług i odpowiednio zaplanować.

Aby obsłużyć błędy podrzędne, można opakowować funkcję AddAsync i FlushAsync w procedurze obsługi wyjątków dla funkcji .NET, aby przechwycić wyjątki z klasy IAsyncCollector. Inną opcją jest użycie zestawów SDK usługi Event Hubs bezpośrednio zamiast używania powiązań wyjściowych.

Kod funkcji

W tej sekcji opisano kluczowe obszary, które należy wziąć pod uwagę podczas pisania kodu w celu przetwarzania zdarzeń w funkcji wyzwalanej przez usługę Event Hubs.

Programowanie asynchroniczne

Zalecamy napisanie funkcji w celu korzystania z kodu asynchronicznego i unikanie blokowania wywołań, szczególnie w przypadku wywołań we/wy.

Poniżej przedstawiono wskazówki, które należy przestrzegać podczas pisania funkcji do przetwarzania asynchronicznie:

  • Wszystkie asynchroniczne lub wszystkie synchroniczne: Jeśli funkcja jest skonfigurowana do uruchamiania asynchronicznie, wszystkie wywołania we/wy powinny być asynchroniczne. W większości przypadków częściowo asynchroniczny kod jest gorszy niż kod, który jest całkowicie synchroniczny. Wybierz asynchroniczną lub synchroniczną i trzymaj się wyboru przez całą drogę.
  • Unikaj blokowania wywołań: Blokowanie wywołań powraca do obiektu wywołującego dopiero po zakończeniu wywołania, w przeciwieństwie do wywołań asynchronicznych, które zwracają natychmiast. Przykładem w języku C# jest wywołanie operacji Task.Result lub Task.Wait podczas operacji asynchronicznej.

Więcej informacji na temat blokowania wywołań

Użycie wywołań blokujących dla operacji asynchronicznych może prowadzić do głodu puli wątków i spowodować awarię procesu funkcji. Awaria występuje, ponieważ wywołanie blokujące wymaga utworzenia innego wątku w celu zrekompensowania oryginalnego wywołania, które teraz czeka. W związku z tym wymaga dwa razy więcej wątków do ukończenia operacji.

Unikanie tej synchronizacji za pośrednictwem podejścia asynchronicznego jest szczególnie ważne, gdy usługa Event Hubs jest zaangażowana, ponieważ awaria funkcji nie aktualizuje punktu kontrolnego. Przy następnym wywołaniu funkcji może ona skończyć się w tym cyklu i wydaje się być zablokowana lub poruszać się powoli, ponieważ wykonania funkcji w końcu upłynął limit czasu.

Rozwiązywanie problemów z tym zjawiskiem zwykle rozpoczyna się od przejrzenia ustawień wyzwalacza i uruchamiania eksperymentów, które mogą obejmować zwiększenie liczby partycji. Badania mogą również prowadzić do zmiany kilku opcji przetwarzania wsadowego, takich jak maksymalny rozmiar partii lub liczba wstępnego pobierania. Wrażenie polega na tym, że jest to problem z przepływnością lub ustawieniem konfiguracji, które wystarczy odpowiednio dostosować. Jednak podstawowym problemem jest sam kod i należy go rozwiązać.

Współautorzy

Ten artykuł jest obsługiwany przez firmę Microsoft. Pierwotnie został napisany przez następującego współautora.

Główny autor:

Aby wyświetlić niepubliowe profile usługi LinkedIn, zaloguj się do serwisu LinkedIn.

Następne kroki

Przed kontynuowaniem rozważ przejrzenie następujących powiązanych artykułów: