Chociaż Natknąłem Kafki przed, ja właśnie niedawno zrealizowane Kafka może być stosowany jako (być może w oparciu o) A CQRS , eventstore .
Jeden z głównych punktów obsługiwanych przez Kafkę:
- Przechwytywanie / przechowywanie zdarzeń, oczywiście wszystkie HA.
- Architektura pubu / podrzędna
- Możliwość odtworzenia dziennika zdarzeń, który umożliwia nowym abonentom zarejestrowanie się w systemie po fakcie.
Trzeba przyznać, że nie jestem w 100% zaznajomiony z CQRS / pozyskiwaniem zdarzeń, ale wydaje się to dość bliskie temu, czym powinien być sklep z wydarzeniami. Zabawne jest to, że naprawdę nie mogę znaleźć tak wiele na temat tego, że Kafka jest używany jako sklep z wydarzeniami, więc być może coś mi brakuje.
Czegoś więc brakuje w Kafce, żeby był to dobry sklep z wydarzeniami? Czy to zadziała? Korzystasz z produkcji? Zainteresowany wglądem, linkami itp.
Zasadniczo stan systemu jest zapisywany na podstawie transakcji / zdarzeń, które system kiedykolwiek otrzymał, zamiast po prostu zapisywać bieżący stan / migawkę systemu, co zwykle się dzieje. (Pomyśl o tym jak o księdze głównej w rachunkowości: wszystkie transakcje ostatecznie sumują się do stanu końcowego) Pozwala to na wszelkiego rodzaju fajne rzeczy, ale po prostu przeczytaj o podanych linkach.
źródło
Odpowiedzi:
Kafka ma być systemem przesyłania wiadomości, który ma wiele podobieństw do sklepu z wydarzeniami, ale cytuje swoje wprowadzenie:
Chociaż wiadomości mogą być potencjalnie przechowywane w nieskończoność, oczekujemy, że zostaną usunięte. Nie oznacza to, że nie możesz używać tego jako sklepu z wydarzeniami, ale może być lepiej użyć czegoś innego. Spójrz na EventStore na alternatywę.
AKTUALIZACJA
Dokumentacja Kafka :
AKTUALIZACJA 2
Jednym z problemów związanych z używaniem Kafki do pozyskiwania wydarzeń jest liczba wymaganych tematów. Zazwyczaj w przypadku pozyskiwania zdarzeń istnieje strumień (temat) zdarzeń na jednostkę (taki jak użytkownik, produkt itp.). W ten sposób bieżący stan encji można odtworzyć przez ponowne zastosowanie wszystkich zdarzeń w strumieniu. Każdy temat Kafka składa się z jednej lub więcej partycji, a każda partycja jest przechowywana jako katalog w systemie plików. Pojawi się również presja ze strony ZooKeepera, gdy liczba znodów rośnie.
źródło
Jestem jednym z oryginalnych autorów Kafki. Kafka będzie działał bardzo dobrze jako dziennik pozyskiwania zdarzeń. Jest odporny na uszkodzenia, skaluje się do ogromnych rozmiarów danych i ma wbudowany model partycjonowania.
Używamy go do kilku przypadków użycia tego formularza na LinkedIn. Na przykład nasz system przetwarzania strumienia open source, Apache Samza, ma wbudowaną obsługę pozyskiwania zdarzeń.
Myślę, że nie słyszysz wiele o używaniu Kafki do pozyskiwania wydarzeń, ponieważ terminologia dotycząca pozyskiwania zdarzeń nie wydaje się być zbyt rozpowszechniona w przestrzeni konsumenckiej, w której Kafka jest najbardziej popularna.
Tutaj pisałem trochę o tym stylu używania Kafki .
źródło
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.
źródło
Możesz używać Kafki jako sklepu z wydarzeniami, ale nie polecam tego, chociaż może to wyglądać na dobry wybór:
Zanim więc dokonasz wyboru, zastanów się dwa razy. Magazyn zdarzeń jako połączenie interfejsów warstwy aplikacji (monitorowanie i zarządzanie), sklep SQL / NoSQL i Kafka jako broker to lepszy wybór niż pozostawienie Kafce obsługi obu ról w celu stworzenia kompletnego rozwiązania pełnego funkcji.
Sklep z wydarzeniami jest złożoną usługą, która wymaga więcej niż to, co może zaoferować Kafka, jeśli poważnie myślisz o zastosowaniu Sourcingu zdarzeń, CQRS, Sagas i innych wzorców w architekturze opartej na zdarzeniach i pozostaje wysoka wydajność.
Zachęcam do zakwestionowania mojej odpowiedzi! Może ci się nie podobać to, co mówię o twoim ulubionym brokerze z wieloma nakładającymi się na siebie możliwościami, ale Kafka nie została zaprojektowana jako sklep z wydarzeniami, ale bardziej jako wysokowydajny broker i bufor w tym samym czasie do obsługi szybkich producentów w porównaniu ze scenariuszami powolnych klientów na przykład.
Zajrzyj do struktury open source eventuate.io microservices, aby dowiedzieć się więcej o potencjalnych problemach: http://eventuate.io/
Aktualizacja od 8 lutego 2018 r
Nie uwzględniam nowych informacji z komentarzy, ale zgadzam się z niektórymi z tych aspektów. Ta aktualizacja zawiera więcej informacji na temat niektórych rekomendacji dla platformy opartej na zdarzeniach w mikrousługach. Jeśli poważnie podchodzisz do solidnej konstrukcji mikrousług i ogólnie najwyższej możliwej wydajności, dam ci kilka wskazówek, które mogą Cię zainteresować.
Jeśli zastanawiasz się nad wydajnością, możesz porównać się z istniejącym pakietem testów. https://github.com/networknt/microservices-framework-benchmark
W ogóle nie używaj Kafki :-)) To pół żart. Mam na myśli to, że chociaż Kafka jest świetny, jest to kolejny system zorientowany na brokera. Myślę, że przyszłość jest w systemach przesyłania wiadomości bez pośredników. Możesz być zaskoczony, ale są szybsze niż systemy Kafka :-), oczywiście musisz zejść na niższy poziom. Spójrz na Kronikę.
Do sklepu z wydarzeniami polecam lepsze rozszerzenie Postgresql o nazwie TimescaleDB, które koncentruje się na przetwarzaniu danych o wysokiej wydajności w seriach czasowych (zdarzeniami są serie czasowe) w dużych ilościach. Oczywiście CQRS, funkcje pozyskiwania zdarzeń (powtórki itp.) Są wbudowane w ramy light4j, które wykorzystują Postgres jako małą pamięć.
Dla wiadomości spróbuj spojrzeć na Chronicle Queue, Map, Engine, Network. Mam na myśli pozbywanie się tych staromodnych rozwiązań zorientowanych na brokera i skorzystanie z systemu mikro-wiadomości (wbudowanego). Kolejka Kroniki jest nawet szybsza niż Kafka. Ale zgadzam się, że to nie wszystko w jednym rozwiązaniu i trzeba trochę popracować, inaczej kupisz wersję Enterprise (płatną). Na koniec wysiłek budowy własnej kroniki z Chronicle zostanie opłacony poprzez usunięcie ciężaru związanego z utrzymywaniem klastra Kafka.
źródło
Tak, możesz używać Kafki jako sklepu z wydarzeniami. Działa całkiem dobrze, zwłaszcza po wprowadzeniu strumieni Kafka , które zapewniają natywny sposób przetwarzania zdarzeń w akumulowany stan, w którym można zapytać .
Jeżeli chodzi o:
To może być trudne. Omówiłem to szczegółowo tutaj: https://stackoverflow.com/a/48482974/741970
źródło
Tak, Kafka działa dobrze w modelu pozyskiwania zdarzeń, szczególnie CQRS, jednak należy zachować ostrożność przy ustalaniu TTL dla tematów i zawsze pamiętać, że Kafka nie został zaprojektowany dla tego modelu, jednak możemy go bardzo dobrze wykorzystać.
źródło
Myślę, że powinieneś przyjrzeć się szkieletowi aksonów wraz z ich wsparciem dla Kafki
źródło