Równoważenie obciążenia partycji na potrzeby przetwarzania zdarzeń

Balansowanie obciążenia partycji jest techniką stosowaną w Azure Event Hubs, która rozkłada obciążenia dotyczące przetwarzania zdarzeń na wiele wystąpień Twojej aplikacji. Klient procesora zdarzeń automatycznie zarządza zarządzaniem partycji i koordynuje dystrybucję pracy wśród wszystkich aktywnych konsumenckich instancji.

W nowszych wersjach zestawu SDK (nowsze wersje 5.0) EventProcessorClient (.NET i Java) lub EventHubConsumerClient (Python i JavaScript) obsługuje automatyczne równoważenie obciążenia. Subskrybujesz zdarzenia, które cię interesują, rejestrując obsługę zdarzeń.

W tym artykule opisano przykładowy scenariusz użycia wielu wystąpień aplikacji klienckich do odczytywania zdarzeń z centrum zdarzeń. Wyjaśniono również kluczowe pojęcia, takie jak własność partycji, punkt kontrolny i równoważenie obciążenia.

Wskazówka

Jeśli używasz starszej wersji biblioteki klienta, zobacz przewodniki dotyczące migracji: .NET, Java, Python i JavaScript.

Uwaga

Kluczem do skalowania w usłudze Event Hubs jest pomysł użytkowników podzielonych na partycje. W przeciwieństwie do wzorca konkurencyjnych konsumentów, wzorzec partycjonowanego konsumenta umożliwia wysoką skalę przez usunięcie wąskiego gardła związanego z rywalizacją i ułatwienie kompleksowej 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. Po stronie konsumenta potrzebujesz mechanizmu, który może odczytywać te zdarzenia, konsolidować je (filtrować, agregować itp.) i zrzucić agregację do bloba magazynowego, który jest następnie wyświetlany na przyjaznej dla użytkownika stronie internetowej.

Aplikacja konsumenta

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

  • Skalowanie: utwórz kilku konsumentów, a każdy z nich jest odpowiedzialny za odczyt 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 po awariach: jeśli konsument (konsument A) ulegnie awarii (na przykład maszyna wirtualna hostująca konsumenta nagle ulegnie 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 momencie, w którym konsument A uległ awarii lub nieco wcześniej.
  • 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-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 zestawach SDK .NET lub Java użyj klienta procesora zdarzeń (EventProcessorClient). W zestawach SDK Python i JavaScript użyj EventHubConsumerClient. W starej wersji SDK host przetwarzania zdarzeń (EventProcessorHost) obsługiwał te funkcje.

W przypadku większości scenariuszy produkcyjnych należy użyć klienta procesora zdarzeń do odczytywania i przetwarzania zdarzeń. Klient procesora zapewnia 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 automatycznie zarządzają dystrybucją i równoważeniem pracy, gdy wystąpienia staną się dostępne lub niedostępne dla grupy.

Własność partycji

Wystąpienie procesora zdarzeń zwykle obsługuje i przetwarza zdarzenia z jednej lub więcej partycji. System równomiernie dystrybuuje własność partycji wśród wszystkich aktywnych wystąpień procesora zdarzeń skojarzonych z kombinacją centrum zdarzeń i grupy 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. System używa tych danych do równoważenia obciążenia między aktywnymi procesorami. Nowe instancje mogą dołączyć do puli przetwarzania, aby zwiększyć skalę. Gdy wystąpienia spadną z powodu awarii lub skalowania w dół, system bezpiecznie przenosi własność partycji do innych aktywnych procesorów.

Rekordy własności partycji w magazynie punktów kontrolnych śledzą przestrzeń nazw 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 moja grupa konsumencka 3be3f9d3-9d9e-4c50-9491-85ece8334ff6 0 2020-01-15T01:22:15
mynamespace.servicebus.windows.net myeventhub moja grupa konsumencka f5cc5176-ce96-4bb4-bbaa-a0e3a9054ecf 1 2020-01-15T01:22:17
mynamespace.servicebus.windows.net myeventhub moja grupa konsumencka 72b980e9-2efc-4ca7-ab1b-ffd7bece8472 2 2020-01-15T01:22:10
:
:
mynamespace.servicebus.windows.net myeventhub moja grupa konsumencka 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 instancje wykryją błąd poprzez sprawdzenie czasu 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 dowolnym momencie istnieje co najwyżej jeden procesor, który odbiera zdarzenia z partycji.

Odbieranie komunikatów

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

Przetwarzaj zdarzenia stosunkowo szybko. Oznacza to, że wykonaj jak najmniejszą operację przetwarzania. Jeśli musisz zapisać w pamięci masowej i przeprowadzić przesyłanie, jest korzystniej użyć dwóch grup odbiorców i mieć dwa procesory zdarzeń.

Punkt kontrolny

Punkt kontrolny to proces, za pomocą którego procesor zdarzeń oznacza lub zatwierdza pozycję ostatniego pomyślnie przetworzonego zdarzenia w ramach partycji. Oznaczanie punktu kontrolnego zazwyczaj odbywa się w funkcji przetwarzającej zdarzenia i ma miejsce dla każdej partycji w grupie odbiorców.

Jeśli procesor zdarzeń rozłącza się z partycją, inne wystąpienie może wznowić przetwarzanie tej partycji od punktu kontrolnego, który ostatni procesor tej partycji w tej grupie odbiorców uprzednio zatwierdził. Gdy procesor łączy się, przekazuje przesunięcie do Event Hub, 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żesz wrócić do starszych danych, określając niższe przesunięcie z tego procesu tworzenia punktów kontrolnych.

Gdy punkt kontrolny oznacza zdarzenie jako przetworzone, dodaje lub aktualizuje wpis w magazynie punktów kontrolnych z przesunięciem i numerem sekwencji zdarzenia. Zdecyduj częstotliwość aktualizowania punktu kontrolnego. Aktualizacja po każdym pomyślnym przetworzeniu zdarzenia może wpływać na wydajność i koszty, ponieważ powoduje operację zapisu danych w podstawowym repozytorium punktów kontrolnych. Ponadto tworzenie punktów kontrolnych dla każdego pojedynczego zdarzenia wskazuje na wzorzec komunikacji w kolejce, dla którego kolejka Service Bus może być lepszym rozwiązaniem niż centrum zdarzeń. Idea stojąca za usługą Event Hubs polega na tym, że zapewnia ona "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 tymi zaleceniami, gdy używasz 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 konta magazynowego do niczego innego.
  • Nie używaj kontenera do niczego innego.
  • Utwórz konto magazynu w tym samym regionie co wdrożona aplikacja. Jeśli aplikacja jest zainstalowana lokalnie, należy wybrać region najbardziej zbliżony.

Na stronie konta magazynowego w portalu Azure, w sekcji usługi Blob, upewnij się, że następujące ustawienia są wyłączone.

  • Hierarchiczna przestrzeń nazw
  • Miękkie usuwanie obiektów BLOB
  • Wersjonowanie

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ą przetwarzane w tle, gdy pompa zdarzeń nadal działa w innych wątkach. Zdarzenia z różnych partycji mogą być przetwarzane współbieżnie. Należy zsynchronizować wszystkie stany udostępnione, do których dostęp jest uzyskiwany między partycjami.

Zobacz następujące samouczki wprowadzające: