Równoważenie obciążenia partycji w wielu wystąpieniach aplikacji

Aby skalować aplikację do przetwarzania zdarzeń, możesz uruchomić wiele wystąpień aplikacji i samodzielnie zrównoważyć obciążenie. W starszych i przestarzałych wersjach EventProcessorHost można równoważyć obciążenie między wieloma wystąpieniami programu i zdarzeniami punktów kontrolnych podczas odbierania zdarzeń. W nowszych wersjach (5.0 lub nowszych), klasy EventProcessorClient (.NET i Java) lub EventHubConsumerClient (Python i JavaScript) umożliwiają wykonywanie tych samych czynności. Model programowania jest prostszy przy użyciu zdarzeń. Możesz subskrybować zdarzenia, które cię interesują, rejestrując procedurę obsługi zdarzeń. Jeśli używasz starej wersji biblioteki klienta, zapoznaj się z następującymi przewodnikami migracji: .NET, Java, Python i JavaScript.

W tym artykule opisano przykładowy scenariusz użycia wielu wystąpień aplikacji klienckich do odczytywania zdarzeń z centrum zdarzeń. Zawiera również szczegółowe informacje o funkcjach klienta procesora zdarzeń, które umożliwiają odbieranie zdarzeń z wielu partycji jednocześnie i równoważenie obciążenia z innymi użytkownikami korzystającymi z tego samego centrum zdarzeń i grupy odbiorców.

Uwaga

Kluczem do skalowania w usłudze Event Hubs jest pomysł użytkowników podzielonych na partycje. W przeciwieństwie do wzorca konkurujących odbiorców wzorzec partycjonowanego konsumenta umożliwia dużą skalę, usuwając wąskie gardło rywalizacji i ułatwiając zakończenie równoległości.

Przykładowy scenariusz

Jako przykładowy scenariusz należy rozważyć firmę zajmującą się bezpieczeństwem domowym, która monitoruje 100 000 domów. Co minutę pobiera dane z różnych czujników, takich jak czujnik ruchu, czujnik otwarcia drzwi/okien, czujnik złamania szkła itd., zainstalowany w każdym domu. Firma udostępnia mieszkańcom witrynę internetową do monitorowania aktywności domu w czasie niemal rzeczywistym.

Każdy czujnik wypycha dane do centrum zdarzeń. Centrum zdarzeń jest skonfigurowane z 16 partycjami. Na koniec zużywania potrzebujesz mechanizmu, który może odczytywać te zdarzenia, konsolidować je (filtr, agregować itd.) i zrzucić agregację do obiektu blob magazynu, który jest następnie przewidywany na przyjazną dla użytkownika stronę internetową.

Aplikacja konsumenta

Podczas projektowania użytkownika w środowisku rozproszonym scenariusz musi obsługiwać następujące wymagania:

  1. Skalowanie: utwórz wielu użytkowników, a każdy użytkownik przejmuje własność odczytu z kilku partycji usługi Event Hubs.
  2. Równoważenie obciążenia: dynamiczne zwiększanie lub zmniejszanie liczby użytkowników. Na przykład po dodaniu nowego typu czujnika (na przykład detektora tlenku węgla) do każdego domu liczba zdarzeń wzrasta. W takim przypadku operator (człowiek) zwiększa liczbę wystąpień konsumentów. Następnie pula użytkowników może ponownie zrównoważyć liczbę posiadanych partycji, aby udostępnić obciążenie nowo dodanym konsumentom.
  3. Bezproblemowe wznawianie awarii: jeśli użytkownik (konsument A) ulegnie awarii (na przykład maszyna wirtualna hostująca konsumenta nagle ulegnie awarii), inni konsumenci mogą odebrać partycje należące do użytkownika A i kontynuować. Ponadto punkt kontynuacji, nazywany punktem kontrolnym lub przesunięciem, powinien znajdować się w dokładnym momencie, w którym konsument A uległ awarii lub nieco wcześniej.
  4. Korzystanie ze zdarzeń: chociaż poprzednie trzy punkty zajmują się zarządzaniem odbiorcą, musi istnieć kod do korzystania ze zdarzeń i zrobić z nim coś przydatnego. Na przykład zagreguj je i przekaż do magazynu obiektów blob.

Procesor zdarzeń lub klient odbiorcy

Nie musisz tworzyć własnego rozwiązania, aby spełnić te wymagania. Zestawy SDK usługi Azure Event Hubs udostępniają tę funkcję. W zestawach SDK platformy .NET lub Java należy użyć klienta procesora zdarzeń (EventProcessorClient), a w zestawach SDK języka Python i JavaScript są używane zestawy EventHubConsumerClientSDK . W starej wersji zestawu SDK był hostem procesora zdarzeń (EventProcessorHost), który obsługiwał te funkcje.

W przypadku większości scenariuszy produkcyjnych zalecamy użycie klienta procesora zdarzeń do odczytywania i przetwarzania zdarzeń. Klient procesora ma zapewnić niezawodne środowisko przetwarzania zdarzeń we wszystkich partycjach centrum zdarzeń w wydajny i odporny na uszkodzenia sposób, zapewniając jednocześnie sposób sprawdzania postępu. Klienci procesora zdarzeń mogą współpracować w kontekście grupy odbiorców dla danego centrum zdarzeń. Klienci będą automatycznie zarządzać dystrybucją i równoważeniem pracy, ponieważ wystąpienia staną się dostępne lub niedostępne dla grupy.

Własność partycji

Wystąpienie procesora zdarzeń zwykle jest właścicielem i przetwarza zdarzenia z co najmniej jednej partycji. Własność partycji jest równomiernie dystrybuowana wśród wszystkich aktywnych wystąpień procesora zdarzeń skojarzonych z połączeniem centrum zdarzeń i grupy odbiorców.

Każdy procesor zdarzeń ma unikatowy identyfikator i własność oświadczeń partycji przez dodanie lub zaktualizowanie wpisu w magazynie punktów kontrolnych. Wszystkie wystąpienia procesora zdarzeń okresowo komunikują się z tym magazynem w celu zaktualizowania własnego stanu przetwarzania i zapoznania się z innymi aktywnymi wystąpieniami. Te dane są następnie używane do równoważenia obciążenia między aktywnymi procesorami. Nowe wystąpienia mogą łączyć pulę przetwarzania w celu skalowania w górę. Gdy wystąpienia spadną z powodu awarii lub skalowania w dół, własność partycji jest bezpiecznie przenoszona do innych aktywnych procesorów.

Rekordy własności partycji w magazynie punktów kontrolnych śledzą przestrzeń nazw usługi Event Hubs, nazwę centrum zdarzeń, grupę odbiorców, identyfikator procesora zdarzeń (znany również jako właściciel), identyfikator partycji i czas ostatniej modyfikacji.

Przestrzeń nazw usługi Event Hubs Nazwa centrum zdarzeń Grupa konsumentów Właściciel Identyfikator partycji Czas ostatniej modyfikacji
mynamespace.servicebus.windows.net myeventhub myconsumergroup 3be3f9d3-9d9e-4c50-9491-85ece8334ff6 0 2020-01-15T01:22:15
mynamespace.servicebus.windows.net myeventhub myconsumergroup f5cc5176-ce96-4bb4-bbaa-a0e3a9054ecf 1 2020-01-15T01:22:17
mynamespace.servicebus.windows.net myeventhub myconsumergroup 72b980e9-2efc-4ca7-ab1b-ffd7bece8472 2 2020-01-15T01:22:10
:
:
mynamespace.servicebus.windows.net myeventhub myconsumergroup 844bd8fb-1f3a-4580-984d-6324f9e208af 15 2020-01-15T01:22:00

Każde wystąpienie procesora zdarzeń uzyskuje własność partycji i rozpoczyna przetwarzanie partycji z ostatniego znanego punktu kontrolnego. Jeśli procesor ulegnie awarii (maszyna wirtualna zostanie zamknięta), inne wystąpienia wykryją je, sprawdzając czas ostatniej modyfikacji. Inne wystąpienia próbują uzyskać własność partycji, które były wcześniej własnością nieaktywnego wystąpienia. Magazyn punktów kontrolnych gwarantuje, że tylko jedno z wystąpień zakończy się powodzeniem w przejmowaniu własności partycji. Dlatego w danym momencie istnieje co najwyżej jeden procesor, który odbiera zdarzenia z partycji.

Odbieranie komunikatów

Podczas tworzenia procesora zdarzeń należy określić funkcje, które przetwarzają zdarzenia i błędy. Każde wywołanie funkcji, która przetwarza zdarzenia, dostarcza pojedyncze zdarzenie z określonej partycji. To Twoja odpowiedzialność za obsługę tego zdarzenia. Jeśli chcesz upewnić się, że użytkownik przetwarza każdy komunikat co najmniej raz, musisz napisać własny kod za pomocą logiki ponawiania prób. Ale bądź ostrożny w kwestii zatrutych wiadomości.

Zalecamy, aby robić rzeczy stosunkowo szybko. Oznacza to, że wykonaj jak najmniejszą operację przetwarzania. Jeśli musisz zapisać w magazynie i przeprowadzić routing, lepiej użyć dwóch grup odbiorców i mieć dwa procesory zdarzeń.

Punkt kontrolny

Tworzenie punktów kontrolnych to proces, za pomocą którego procesor zdarzeń oznacza lub zatwierdza pozycję ostatniego pomyślnie przetworzonego zdarzenia w ramach partycji. Oznaczanie punktu kontrolnego jest zwykle wykonywane w ramach funkcji, która przetwarza zdarzenia i występuje na podstawie poszczególnych partycji w grupie odbiorców.

Jeśli procesor zdarzeń rozłącza się z partycją, inne wystąpienie może wznowić przetwarzanie partycji w punkcie kontrolnym, który został wcześniej zatwierdzony przez ostatni procesor tej partycji w tej grupie odbiorców. Gdy procesor łączy się, przekazuje przesunięcie do centrum zdarzeń, aby określić lokalizację, w której ma rozpocząć odczytywanie. W ten sposób można użyć punktów kontrolnych, aby oznaczyć zdarzenia jako "kompletne" przez aplikacje podrzędne i zapewnić odporność, gdy procesor zdarzeń ulegnie awarii. Można wrócić do starszych danych, określając niższe przesunięcie z tego procesu tworzenia punktów kontrolnych.

Gdy punkt kontrolny jest wykonywany w celu oznaczania zdarzenia jako przetworzonego, wpis w magazynie punktów kontrolnych jest dodawany lub aktualizowany przy użyciu przesunięcia i numeru sekwencji zdarzenia. Użytkownicy powinni decydować o częstotliwości aktualizowania punktu kontrolnego. Aktualizacja po każdym pomyślnym przetworzeniu zdarzenia może mieć wpływ na wydajność i koszty, ponieważ wyzwala operację zapisu w bazowym magazynie punktów kontrolnych. Ponadto tworzenie punktów kontrolnych dla każdego pojedynczego zdarzenia wskazuje na wzorzec obsługi komunikatów w kolejce, dla którego kolejka usługi Service Bus może być lepszym rozwiązaniem niż centrum zdarzeń. Chodzi o to, że usługa Event Hubs zapewnia "co najmniej jednokrotne" dostarczanie na dużą skalę. Dzięki temu, że systemy podrzędne są idempotentne, łatwo jest odzyskać dane po awariach lub ponownym uruchomieniu, które powodują wielokrotne odbieranie tych samych zdarzeń.

Postępuj zgodnie z poniższymi zaleceniami w przypadku korzystania z usługi Azure Blob Storage jako magazynu punktów kontrolnych:

  • Użyj oddzielnego kontenera dla każdej grupy odbiorców. Możesz użyć tego samego konta magazynu, ale użyj jednego kontenera dla każdej grupy.
  • Nie używaj kontenera dla żadnych innych elementów i nie używaj konta magazynu dla innych elementów.
  • Konto magazynu powinno znajdować się w tym samym regionie co wdrożona aplikacja. Jeśli aplikacja jest lokalna, spróbuj wybrać możliwy region najbliżej.

Na stronie Konto magazynu w witrynie Azure Portal w sekcji Blob Service upewnij się, że następujące ustawienia są wyłączone.

  • Hierarchiczna przestrzeń nazw
  • Usuwanie nietrwałe obiektów blob
  • Wersje

Wystąpienia zabezpieczeń wątków i procesora

Domyślnie funkcja, która przetwarza zdarzenia, jest wywoływana sekwencyjnie dla danej partycji. Kolejne zdarzenia i wywołania tej funkcji z tej samej kolejki partycji w tle, co pompa zdarzeń nadal działa w tle w innych wątkach. Zdarzenia z różnych partycji mogą być przetwarzane współbieżnie, a wszystkie udostępnione stany, do których uzyskuje się dostęp między partycjami, muszą być synchronizowane.

Następne kroki

Zobacz następujące przewodniki Szybki start: