Wracam do tej kontroli jakości. I nie znalazłem wystarczających niuansów w istniejących odpowiedziach, więc dodaję tę.
TL; DR. Tak lub Nie, w zależności od wykorzystania źródła zdarzeń.
Są dwa podstawowe rodzaje systemów pochodzących ze zdarzeń, o których jestem świadomy.
Procesory zdarzeń podrzędnych = Tak
W tego rodzaju systemie wydarzenia zdarzają się w prawdziwym świecie i są rejestrowane jako fakty. Na przykład system magazynowy do śledzenia palet produktów. Zasadniczo nie ma konfliktów. Wszystko już się wydarzyło, nawet jeśli było źle. (Tj. Paleta 123456 umieszczona na ciężarówce A, ale została zaplanowana na ciężarówkę B.) Następnie fakty są sprawdzane pod kątem wyjątków za pośrednictwem mechanizmów sprawozdawczych. Wydaje się, że Kafka nadaje się do tego rodzaju aplikacji przetwarzających zdarzenia.
W tym kontekście zrozumiałe jest, dlaczego ludzie Kafki opowiadają się za rozwiązaniem Sourcing zdarzeń. Ponieważ jest bardzo podobny do tego, jak jest już używany, na przykład w strumieniach kliknięć. Jednak osoby używające terminu Sourcing zdarzeń (w przeciwieństwie do przetwarzania strumieniowego) prawdopodobnie odnoszą się do drugiego użycia ...
Kontrolowane przez aplikację źródło prawdy = nie
Ten rodzaj aplikacji deklaruje własne zdarzenia w wyniku wniosków użytkowników przesyłanych przez logikę biznesową. Kafka nie działa dobrze w tym przypadku z dwóch głównych powodów.
Brak izolacji bytu
Ten scenariusz wymaga możliwości załadowania strumienia zdarzeń dla określonego obiektu. Częstym tego powodem jest zbudowanie modelu zapisu przejściowego dla logiki biznesowej w celu przetworzenia żądania. W Kafce jest to niepraktyczne. Użycie tematu na jednostkę może na to pozwolić, z wyjątkiem tego, że nie jest to starter, gdy mogą istnieć tysiące lub miliony podmiotów. Wynika to z ograniczeń technicznych w Kafka / Zookeeper.
Jednym z głównych powodów stosowania przejściowego modelu zapisu w ten sposób jest tanie i łatwe do wdrożenia zmiany logiki biznesowej.
Użycie Kafka jest zalecane zamiast tematu dla typu, ale wymagałoby to załadowania zdarzeń dla każdej jednostki tego typu, aby uzyskać zdarzenia dla pojedynczej jednostki. Ponieważ nie można stwierdzić na podstawie pozycji dziennika, które zdarzenia należą do której jednostki. Nawet przy użyciu migawek, aby rozpocząć od znanej pozycji dziennika, może to oznaczać znaczną liczbę zdarzeń.
Brak wykrywania konfliktu
Po drugie, użytkownicy mogą tworzyć warunki wyścigu z powodu równoczesnych żądań skierowanych do tego samego podmiotu. Zapisywanie sprzecznych zdarzeń i rozwiązywanie ich po fakcie może być całkiem niepożądane. Dlatego ważne jest, aby móc zapobiegać konfliktom. Aby skalować ładowanie żądań, często używa się usług bezstanowych, jednocześnie zapobiegając konfliktom zapisu przy użyciu zapisów warunkowych (zapis tylko, jeśli ostatnim zdarzeniem encji było #x). Aka Optimistic Concurrency. Kafka nie obsługuje optymistycznej współbieżności. Nawet jeśli wspierałoby to na poziomie tematu, musiałoby być aż do poziomu encji, aby było skuteczne. Aby używać Kafki i zapobiegać konfliktom zdarzeń, musisz użyć stanowego, zserializowanego programu piszącego na poziomie aplikacji. Jest to znaczące wymaganie / ograniczenie architektoniczne.
Dalsza informacja
Zaktualizuj według komentarza
Komentarz został usunięty, ale pytanie brzmiało: co ludzie wykorzystują do przechowywania zdarzeń?
Wygląda na to, że większość ludzi umieszcza własną implementację pamięci zdarzeń na istniejącej bazie danych. W przypadku scenariuszy nie dystrybuowanych, takich jak wewnętrzne zaplecze lub produkty autonomiczne, dobrze udokumentowano sposób tworzenia magazynu zdarzeń opartego na języku SQL. Istnieją biblioteki dostępne na różnych bazach danych. Istnieje również EventStore , który został zbudowany w tym celu.
W scenariuszach rozproszonych widziałem kilka różnych implementacji. Projekt Panther Jet używa platformy Azure CosmosDB z funkcją Zmień kanał informacyjny, aby powiadomić słuchaczy. Inną podobną implementacją, o której słyszałem w AWS, jest użycie DynamoDB z funkcją strumieni do powiadamiania słuchaczy. Klucz partycji prawdopodobnie powinien być identyfikatorem strumienia dla najlepszej dystrybucji danych (aby zmniejszyć ilość nadmiernej obsługi administracyjnej). Jednak pełne odtworzenie w różnych strumieniach w Dynamo jest drogie (odczyt i koszt). Więc ten impl został również skonfigurowany dla strumieni dynamo do zrzucania zdarzeń do S3. Kiedy nowy słuchacz wchodzi w tryb online lub istniejący słuchacz chce pełnej powtórki, najpierw przeczytałby S3, aby go nadrobić.
Mój obecny projekt jest scenariuszem obejmującym wiele dzierżawców, a swój własny projekt wprowadziłem na Postgres. Coś takiego jak Citus wydaje się odpowiednie dla skalowalności, partycjonowanie według tentant + stream.
Kafka jest nadal bardzo przydatny w scenariuszach rozproszonych. Nie jest trywialnym problemem udostępnianie zdarzeń każdej usługi innym usługom. Sklep z wydarzeniami zwykle nie jest do tego budowany, ale właśnie to robi Kafka. Każda usługa ma własne wewnętrzne źródło prawdy (może być przechowywaniem zdarzeń lub w inny sposób), ale słucha Kafki, aby wiedzieć, co dzieje się „na zewnątrz”. Serwis może także publikować wydarzenia w Kafce, aby informować „poza” o interesujących rzeczach, które zrobiła usługa.