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 klasa EventProcessorHost umożliwia równoważenie obciążenia między wieloma wystąpieniami programu i zdarzeniami punktów kontrolnych podczas odbierania. W nowszych wersjach (5.0 lub nowszych), klasy EventProcessorClient (.NET i Java) lub EventHubConsumerClient (Python i JavaScript) umożliwiają wykonywanie tych samych czynności.

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 końcu korzystania potrzebny jest mechanizm, który może odczytywać te zdarzenia, konsolidować je i zrzucić agregację do obiektu blob magazynu, który jest następnie przewidywany 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 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.
  • 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.
  • Korzystanie ze zdarzeń: chociaż poprzednie trzy punkty zajmują się zarządzaniem konsumentem, 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 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, ponieważ wystąpienia staną się dostępne lub niedostępne dla grupy.

Śledzenie własności 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.

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ń.

Tworzenie punktów kontrolnych

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.

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.