Skalowanie aplikacji przetwarzania

Ukończone

Aby skalować aplikację przetwarzania zdarzeń, możesz uruchomić wiele wystąpień aplikacji i równoważyć obciążenie między sobą. W starszych wersjach EventProcessorHost umożliwia równoważenie obciążenia między wieloma wystąpieniami programu i zdarzeniami punktów kontrolnych podczas odbierania. W nowszych wersjach (nowszych wersji 5.0) EventProcessorClient (.NET i Java) lub EventHubConsumerClient (Python i JavaScript) umożliwia wykonywanie tych samych czynności.

Notatka

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

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. Po stronie konsumenta potrzebny jest mechanizm, który może odczytywać te zdarzenia, konsolidować je i zapisać zebrane dane do obiektu blob w magazynie, który jest następnie przekształcany na przyjazną dla użytkownika stronę internetową.

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

  • Skalowanie: Utwórz wielu użytkowników, a każdy użytkownik przejmuje własność odczytu z kilku partycji usługi Event Hubs.
  • Równoważenie obciążenia: dynamiczne zwiększanie lub zmniejszanie liczby konsumentó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.
  • Płynne wznawianie działań po niepowodzeniach: Jeśli konsument (konsument A) doświadcza niepowodzenia (na przykład maszyna wirtualna hostująca konsumenta nagle ulega awarii), inni konsumenci mogą przejąć partycje należące do konsumenta A i kontynuować. Ponadto punkt kontynuacji, nazywany punktem kontrolnym lub przesunięciem , powinien znajdować się w dokładnym punkcie, w którym konsument A zawiódł, lub nieco wcześniej.
  • Korzystanie ze zdarzeń: Podczas gdy poprzednie trzy punkty zajmują się zarządzaniem konsumentem, musi istnieć kod, aby korzystać ze zdarzeń i robić z nim coś przydatnego. Na przykład zagreguj je i przekaż do magazynu blobów.

Procesor zdarzeń lub klient konsument

Nie musisz tworzyć własnego rozwiązania, aby spełnić te wymagania. Zestawy SDK usługi Azure Event Hubs udostępniają tę funkcję. W SDK-ach .NET lub Java używasz klienta procesora zdarzeń (EventProcessorClient), a w SDK-ach Python i JavaScript używasz EventHubConsumerClient.

W przypadku większości scenariuszy produkcyjnych zalecamy użycie klienta procesora zdarzeń do odczytywania i przetwarzania zdarzeń. 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 w miarę jak instancje staną się dostępne lub niedostępne dla grupy.

Śledzenie własności partycji

Wystąpienie procesora zdarzeń zwykle zarządza i przetwarza zdarzenia z co najmniej jednej partycji. Własność partycji jest równomiernie rozdzielana wśród wszystkich aktywnych instancji procesora zdarzeń powiązanych z centrum zdarzeń i grupą odbiorców.

Każdy procesor zdarzeń ma unikatowy identyfikator i przejmuje kontrolę nad partycjami, dodając lub aktualizując wpis 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.

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 potrzebujesz zapisać dane w magazynie i przeprowadzić routing, lepiej użyć dwóch grup konsumentów i mieć dwa procesory zdarzeń.

Punktowanie kontrolne

checkpointing to proces, za pomocą którego procesor zdarzeń oznacza lub zatwierdza pozycję ostatniego pomyślnie przetworzonego zdarzenia w partycji. Oznaczanie punktu kontrolnego jest zwykle wykonywane w funkcji przetwarzającej zdarzenia i odbywa się dla każdej 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 się łączy, przekazuje przesunięcie do centrum wydarzeń, aby określić lokalizację, w której należy 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 w procesie punktów kontrolnych.

Bezpieczeństwo wątków i instancje 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 są w tle, podczas gdy pompa zdarzeń nadal działa w tle na 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.