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 usług 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 skalowanie funkcji aplikacji funkcji. Można grupować według praw dostępu, wdrożenia i wzorców użycia, które wywołują kod.

Aby uzyskać wskazówki dotyczące najlepszych rozwiązań dotyczących funkcji dotyczących grupowania i innych aspektów, zobacz Najlepsze rozwiązania dotyczące niezawodnej usługi Azure Functions i Poprawianie wydajności i niezawodności usługi 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 tę funkcją a innymi funkcjami, izolować 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łasny ślad 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 w przypadku 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 konsumentów mają różne poglądy, co oznacza, że stany, pozycje i przesunięcia mogą się różnić. Grupy odbiorców umożliwiają wielu aplikacjom zużywających własne widoki strumienia zdarzeń oraz odczytywanie strumienia niezależnie 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 usłudze Azure Event Hubs.

    Grupa odbiorców ma skojarzoną z nią co najmniej jedną aplikację konsumenckią, 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ć podstawy optymalnej wydajności i skalowania.

Plany hostingu funkcji

Istnieje kilka opcji hostingu dla aplikacji funkcji i ważne jest, aby przejrzeć ich możliwości. Aby uzyskać informacje o tych opcjach hostingu, zobacz Opcje hostingu usługi Azure Functions. Zwróć uwagę na sposób skalowania 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 i pamięć. W ramach planu dedykowanego uruchamiasz funkcje w planie usługi aplikacja systemu Azure Service według zwykłych stawek planu usługi 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 ładowania lub unikatowe wymagania, najlepiej hostować je w różnych planach, szczególnie w aplikacjach do przetwarzania strumieniowego.

Usługa Azure Container Apps zapewnia zintegrowaną obsługę tworzenia, wdrażania i zarządzania konteneryzowanymi aplikacjami funkcji w usłudze Azure Functions. Dzięki temu można uruchamiać funkcje sterowane zdarzeniami w w pełni zarządzanym środowisku opartym na platformie Kubernetes z wbudowaną obsługą monitorowania typu open source, mTLS, Dapr i KEDA.

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 wpływają na skalowanie w przypadku 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 usługa Azure Event Hubs dla platformy Apache Kafka.

Opis jednostek przepływności (TU)

W warstwie Standardowa usługi Event Hubs przepływność jest klasyfikowana jako ilość danych wprowadzona i jest odczytywana z przestrzeni nazw na jednostkę czasu. Jednostki TU są wstępnie zakupionymi jednostkami 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 mają wpływ na liczbę bajtów i zdarzeń, które są publikowane i odczytywane z centrum zdarzeń.

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

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ą autowypełniania

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 TU. 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 dodawana pojemność nie jest już potrzebna.

Jeśli aplikacja potrzebuje pojemności przekraczającej maksymalną dozwoloną liczbę jednostek TU, 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 Dedicated. 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 w razie potrzeby. Dedykowany plan hostingu uruchamia funkcje w planie usługi App Service i wymaga ręcznego skonfigurowania wystąpień lub skonfigurowania schematu skalowania automatycznego. Aby uzyskać więcej informacji, zobacz Dedykowane plany hostingu dla usługi Azure Functions.

Ostatecznie relacja jeden do jednego między liczbą partycji i wystąpień funkcji lub odbiorców jest idealnym celem maksymalnej przepływności w rozwiązaniu 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ń 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ść 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ą odbiorców (wystąpień funkcji), tym więcej partycji istnieje, tym większa może być współbieżna przepływność. Ten fakt jest ważny, gdy udostępniasz wyznaczoną liczbę jednostek TU dla centrum zdarzeń innym aplikacjom konsumenckim.
  • Więcej funkcji może wymagać większej ilości pamięci: w miarę zwiększania się liczby wystąpień funkcji tak samo 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 obciążenia zwrotnego z usług podrzędnych: w miarę generowania większej przepływności ryzyko przeciążenia usług podrzędnych lub otrzymania z nich presji zwrotnej. 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 rozrzedzony: kombinacja wielu partycji i mała liczba 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 nie określono klucza partycji lub identyfikatora, 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 konsumentów.

W przypadku wymagania 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 kolejność zdarzeń musi zostać zachowana.

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ę do 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 wyzwalanych funkcji

Można skonfigurować funkcje wyzwalane przez centrum zdarzeń w celu przetworzenia partii zdarzeń lub jednego zdarzenia naraz. Przetwarzanie partii zdarzeń może być bardziej wydajne, gdy zmniejsza część obciążenia wywołań 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ęzyki JavaScript, Python i inne 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 przetwarzania wsadowego, zobacz Wyzwalacz usługi Azure Event Hubs dla usługi 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 usługi Functions:

  • 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 ilość, funkcja jest nadal wywoływana z dowolną liczbą zdarzeń, ile jest dostępnych. 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 istnieje punkt kontrolny, gdy funkcja pomyślnie przetworzy pojedynczą partię. Punkt kontrolny jest tworzony na poziomie partycji dla każdego czytelnika w grupie odbiorców. Aby uzyskać informacje na temat wpływu tego ustawienia na powtórki i ponawianie prób zdarzeń, zobacz Funkcja platformy Azure wyzwalana przez centrum zdarzeń: powtórki 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ń 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 tworzenia punktów kontrolnych, zobacz Funkcje i terminologia w usłudze Azure Event Hubs.

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

  • Wyjątki nadal są uwzględniane 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 partięCheckpointFrequency. Jeśli nadszedł czas na utworzenie punktu kontrolnego, niezależnie od tego, czy wystąpiły wyjątki. Fakt, że wyjątki nie mają wpływu na punkt kontrolny, nie powinny mieć wpływu na właściwe użycie sprawdzania wyjątków i obsługi.
  • Częstotliwość wsadowa ma znaczenie: w rozwiązaniach do przesyłania strumieniowego zdarzeń o dużej ilości warto zmienić ustawienie 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órzenia mogą się zdarzyć: za każdym razem, gdy funkcja jest wywoływana za pomocą powiązania wyzwalacza usługi Event Hubs, używa najnowszego punktu kontrolnego, aby określić, gdzie wznowić przetwarzanie. Przesunięcie dla każdego odbiorcy jest zapisywane na poziomie partycji dla każdej grupy odbiorców. Powtórzenia mają miejsce, gdy punkt kontrolny nie występuje podczas ostatniego wywołania funkcji, a funkcja jest wywoływana ponownie. Aby uzyskać więcej informacji na temat duplikatów i technik deduplikacji, zobacz Idempotency ( Idempotency).

Zrozumienie tworzenia 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 telemetrii

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ść. Niektóre istotne ustawienia i zagadnienia dotyczące monitorowania i wydajności to:

  • 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 z niepotrzebnymi telemetriami i metrykami.
  • 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 do konta magazynu używanego 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ń WebJobs, 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, zwłaszcza 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 usługi 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 cykle życia klienta, jak i połączenia oraz zmniejsza potencjalne problemy, które mogą wystąpić w przypadku wyczerpania portów i zarządzania pulą połączeń.
  • Mniej kodu: powiązanie powoduje abstrakcję bazowego zestawu SDK i zmniejsza ilość kodu potrzebnego do publikowania zdarzeń. Ułatwia pisanie kodu, który ułatwia pisanie i konserwację.
  • Przetwarzanie wsadowe: 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 funkcje oraz przewodniki 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.

Wsadowe 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ęzykach C#, Java, Python i JavaScript.

Wyprowadza wiele zdarzeń za pomocą modelu przetwarzania (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 natychmiast po jej wywołaniu.
  • IAsyncCollector <T>. Metoda AddAsync() przygotowuje zdarzenia do opublikowania w strumieniu zdarzeń. Jeśli napiszesz funkcję asynchroniczną, należy użyć klasy 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 Powiązanie wyjściowe usługi Azure Event Hubs dla usługi Azure Functions.

Generowanie wielu zdarzeń za pomocą modelu izolowanego procesu roboczego (C#)

W zależności od wersji środowiska uruchomieniowego usługi Functions model izolowanego procesu roboczego będzie obsługiwał różne typy parametrów przekazywanych do powiązania wyjściowego. W przypadku wielu zdarzeń tablica służy do hermetyzacji zestawu. Zaleca się przejrzenie atrybutów powiązania danych wyjściowych i szczegółów użycia dla modelu izolowanego oraz zanotowanie różnic między wersjami rozszerzeń.

Ograniczanie i ciśnienie wsteczne

Zagadnienia dotyczące ograniczania przepustowości dotyczą powiązań 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 w modelu przetwarzania, można opakowywać metodę AddAsync i FlushAsync w procedurze obsługi wyjątków dla funkcji platformy .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.

Jeśli korzystasz z modelu izolowanego dla funkcji, obsługa wyjątków strukturalnych powinna być używana do odpowiedzialnego przechwytywania wyjątków podczas zwracania wartości 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 używania kodu asynchronicznego i uniknięcia wywołań blokujących, zwłaszcza w przypadku angażowania wywołań we/wy.

Poniżej przedstawiono wskazówki, które należy przestrzegać podczas pisania funkcji w celu asynchronicznego przetwarzania:

  • 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 opcję asynchroniczną lub synchroniczną, a następnie 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 skończyć się w tym cyklu i wydaje się być zablokowane lub przechodzić powoli, ponieważ wykonania funkcji w końcu upłynął limit czasu.

Rozwiązywanie tego problemu 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 dzielenia na partie, takich jak maksymalny rozmiar partii lub liczba pobrań wstępnych. Wrażenie polega na tym, że jest to problem z przepływnością lub ustawieniem konfiguracji, które należy 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ć niepubalne profile serwisu LinkedIn, zaloguj się do serwisu LinkedIn.

Następne kroki

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