Verwenden von Kafka als (CQRS) Eventstore. Gute Idee?

219

Obwohl ich kenne Kafka vor, ich habe gerade vor kurzem realisiert Kafka vielleicht als (der Basis) ein verwendet werden können CQRS , eventstore .

Einer der wichtigsten Punkte, die Kafka unterstützt:

  • Ereigniserfassung / -speicherung, natürlich alle HA.
  • Pub / Sub-Architektur
  • Möglichkeit zur Wiedergabe des Ereignisprotokolls, wodurch sich neue Abonnenten nachträglich beim System registrieren können.

Zugegeben, ich bin nicht 100% mit CQRS / Event-Sourcing vertraut, aber dies scheint ziemlich nah an dem zu sein, was ein Eventstore sein sollte. Das Lustige ist: Ich kann wirklich nicht so viel darüber finden, dass Kafka als Eventstore genutzt wird, also fehlt mir vielleicht etwas.

Fehlt also etwas in Kafka, um ein guter Eventladen zu sein? Würde es funktionieren? Verwenden Sie es Produktion? Interessiert an Einsichten, Links usw.

Grundsätzlich wird der Status des Systems basierend auf den Transaktionen / Ereignissen gespeichert, die das System jemals empfangen hat, anstatt nur den aktuellen Status / Snapshot des Systems zu speichern, wie dies normalerweise der Fall ist. (Betrachten Sie es als Hauptbuch im Rechnungswesen: Alle Transaktionen summieren sich letztendlich zum Endzustand.) Dies ermöglicht alle Arten von coolen Dingen, aber lesen Sie einfach die bereitgestellten Links.

Geert-Jan
quelle
Hallo Geert-Jan. Wie sind Sie rückblickend mit diesem Problem umgegangen? Ich habe eine verwandte Frage (hier verfügbar : stackoverflow.com/questions/58763727/… ). Die meisten Leute, die Kafkas Adoption vorschlagen, scheinen sich auf die Punkte der Unveränderlichkeit des Anhängens, des hohen Durchsatzes und der Garantie der Partitionsreihenfolge zu verlassen. Ich sehe Probleme im Zusammenhang mit der schnellen Suche innerhalb von Themen (für die "Rekonstruktion" von Entitäten), keine Transaktionsatomarität und keine Reihenfolge über Partitionen hinweg (100% Bestellgarantie impliziert die Verwendung von nur 1 Partition - Tötung der Parallelität)
Tony _008
Ich habe es am Ende nicht weiter verfolgt, weil ich dieses Nebenprojekt beendet habe. Also keine klare Antwort, fürchte ich
Geert-Jan

Antworten:

119

Kafka soll ein Messaging-System sein, das viele Ähnlichkeiten mit einem Event-Store aufweist, um jedoch deren Intro zu zitieren:

Der Kafka-Cluster speichert alle veröffentlichten Nachrichten - unabhängig davon, ob sie verbraucht wurden oder nicht - für einen konfigurierbaren Zeitraum . Wenn die Aufbewahrung beispielsweise auf zwei Tage festgelegt ist, steht sie für die zwei Tage nach Veröffentlichung einer Nachricht zum Verzehr zur Verfügung. Danach wird sie verworfen, um Speicherplatz freizugeben. Die Leistung von Kafka ist in Bezug auf die Datengröße praktisch konstant, sodass das Beibehalten vieler Daten kein Problem darstellt.

Während Nachrichten möglicherweise unbegrenzt aufbewahrt werden können, wird erwartet, dass sie gelöscht werden. Dies bedeutet nicht, dass Sie dies nicht als Ereignisspeicher verwenden können, aber es ist möglicherweise besser, etwas anderes zu verwenden. Schauen Sie sich EventStore für eine Alternative an.

AKTUALISIEREN

Kafka-Dokumentation :

Event Sourcing ist eine Art des Anwendungsdesigns, bei der Statusänderungen als zeitlich geordnete Folge von Datensätzen protokolliert werden. Die Unterstützung von Kafka für sehr große gespeicherte Protokolldaten macht es zu einem hervorragenden Backend für eine Anwendung, die in diesem Stil erstellt wurde.

UPDATE 2

Ein Problem bei der Verwendung von Kafka für die Beschaffung von Veranstaltungen ist die Anzahl der erforderlichen Themen. In der Regel gibt es bei der Ereignisbeschaffung einen Datenstrom (Thema) pro Entität (z. B. Benutzer, Produkt usw.). Auf diese Weise kann der aktuelle Status einer Entität wiederhergestellt werden, indem alle Ereignisse im Stream erneut angewendet werden. Jedes Kafka-Thema besteht aus einer oder mehreren Partitionen und jede Partition wird als Verzeichnis im Dateisystem gespeichert. Mit zunehmender Anzahl von Knoten wird auch ZooKeeper Druck ausüben.

eulerfx
quelle
16
Ich sah Kafka an und hatte ein anderes Problem: Ich bemerkte nichts über optimistische Parallelität. Im Idealfall könnte ich sagen: "Fügen Sie dieses Ereignis nur dann als Element N + 1 hinzu, wenn das letzte Ereignis des Objekts noch N ist."
Darien
2
@Darien: Ich gehe wahrscheinlich mit einem Setup, bei dem Redis Kafka füttert (mithilfe von Redis-Benachrichtigungen ). Da Redis eine optimistische Parallelität zulässt (mit Watch / Multi-Exec), sollte dies funktionieren
Geert-Jan
2
@Darien Ich bin kein Experte für Event-Sourcing, aber ich habe verstanden, dass Sie im Allgemeinen keine optimistische Parallelität benötigen würden, da Ereignisse per Definition Aufzeichnungen von Dingen sind, die bereits historisch geschehen sind.
John
4
@John Ich denke, wenn Sie bereits eine maßgebliche Reihenfolge für nicht widersprüchliche Ereignisse haben, bedeutet dies, dass Ihre eigentliche Event-Store-Technologie überall dort ist, wo sie leben, und Kafka wird nur als sekundäres System verwendet, um sie zu verteilen.
Darien
1
Es gibt auch wertvolle Informationen hier: groups.google.com/forum/#!topic/dddcqrs/rm02iCfffUY
manuc66
283

Ich bin einer der ursprünglichen Autoren von Kafka. Kafka eignet sich sehr gut als Protokoll für die Beschaffung von Ereignissen. Es ist fehlertolerant, skaliert auf enorme Datengrößen und verfügt über ein integriertes Partitionierungsmodell.

Wir verwenden es für mehrere Anwendungsfälle dieses Formulars bei LinkedIn. Zum Beispiel bietet unser Open-Source-Stream-Verarbeitungssystem Apache Samza eine integrierte Unterstützung für die Ereignisbeschaffung.

Ich denke, Sie hören nicht viel über die Verwendung von Kafka für die Ereignisbeschaffung, vor allem, weil die Terminologie für die Ereignisbeschaffung im Consumer-Webspace, in dem Kafka am beliebtesten ist, nicht sehr verbreitet zu sein scheint.

Ich habe ein wenig über diese Art von Kafka Nutzung geschrieben hier .

Jay Kreps
quelle
2
Wollte diesen Link posten :) Super Blog-Beitrag. Es wäre gut gewesen, es kommentieren zu können, weil ich viele Fragen habe. @ Geert-Jan werfen Sie auch einen Blick auf "Lambda-Architektur", dies ist ziemlich ähnlich und der Name wird vom Storm-Autor gegeben, meistens unter Verwendung eines Hadoop-basierten Ereignisprotokolls in vielen Beispielen
Sebastien Lorber
6
@Jay: Da ich mich erneut für dieses Thema interessiert habe, können Sie bitte etwas näher darauf eingehen, dass Kafka so konzipiert zu sein scheint , dass die veröffentlichten Nachrichten nach einer festgelegten Zeitspanne ablaufen. Wenn Sie Kafka als Ereignisquelle verwenden, sollten Nachrichten unbegrenzt gespeichert werden. Es ist wahrscheinlich konfigurierbar, aber würde dies ein Problem darstellen?
Geert-Jan
2
Gibt es Vergleiche zwischen Kafka und Eventstore? Insbesondere gefällt mir der Fokus auf FRP im Eventstore namens Projections. Gibt es so etwas in Kafka / Samza?
CMCDragonkai
4
Ich interessiere mich auch für die Frage von @ Geert-Jan an Jay. Kafka ist nicht für die eigentliche Transaktionsseite der Ereignisbeschaffung geeignet, da pro Domänenaggregat (denken Sie an Millionen) ein Strom von Ereignissen (Thema) erforderlich ist. Es ist jedoch ideal geeignet, um Ereignisse von z. B. GetEventStore einspeisen zu lassen. Dies funktioniert jedoch nur mit unendlich beibehaltenen Ereignissen (in unserem Fall), und abgesehen von einigen kurzen Kommentaren scheint dies kein unterstützter Anwendungsfall von Kafka zu sein? Irre ich mich hier Samza geht beispielsweise davon aus, dass es nur zwei Szenarien gibt: zeitbasierte Aufbewahrung oder schlüsselbasierte Aufbewahrung. Es gibt andere ..
Stephen Drew
3
@eulerfx Angenommen, wir möchten Kafka als Speicher für ein Ereignisquellen-System verwenden. Wie sollte optimistisches Sperren / Parallelität implementiert werden?
Krzysztof Branicki
51

Ich komme immer wieder auf diese Qualitätssicherung zurück. Und ich fand die vorhandenen Antworten nicht nuanciert genug, also füge ich diese hinzu.

TL; DR. Ja oder Nein, abhängig von Ihrer Event-Sourcing-Nutzung.

Es gibt zwei Hauptarten von Event-Sourcing-Systemen, die mir bekannt sind.

Downstream-Ereignisprozessoren = Ja

In einem solchen System ereignen sich Ereignisse in der realen Welt und werden als Fakten aufgezeichnet. Zum Beispiel ein Lagersystem zur Verfolgung von Produktpaletten. Grundsätzlich gibt es keine widersprüchlichen Ereignisse. Alles ist schon passiert, auch wenn es falsch war. (Dh Palette 123456 auf LKW A gestellt, aber für LKW B geplant.) Später werden die Fakten über Meldemechanismen auf Ausnahmen überprüft. Kafka scheint für diese Art von nachgeschalteter Ereignisverarbeitungsanwendung gut geeignet zu sein.

In diesem Zusammenhang ist es verständlich, warum Kafka-Leute es als Event-Sourcing-Lösung befürworten. Weil es ziemlich ähnlich ist, wie es beispielsweise bereits in Klick-Streams verwendet wird. Personen, die den Begriff Event Sourcing (im Gegensatz zu Stream Processing) verwenden, beziehen sich jedoch wahrscheinlich auf die zweite Verwendung ...

Anwendungsgesteuerte Wahrheitsquelle = Nr

Diese Art von Anwendung deklariert ihre eigenen Ereignisse als Ergebnis von Benutzeranforderungen, die die Geschäftslogik durchlaufen. Kafka funktioniert in diesem Fall aus zwei Hauptgründen nicht gut.

Fehlende Entitätsisolation

Dieses Szenario erfordert die Fähigkeit, den Ereignisstrom für eine bestimmte Entität zu laden. Der häufigste Grund hierfür ist die Erstellung eines transienten Schreibmodells für die Geschäftslogik zur Verarbeitung der Anforderung. Dies zu tun ist in Kafka unpraktisch. Die Verwendung von Topic-per-Entity kann dies ermöglichen, es sei denn, dies ist kein Starter, wenn Tausende oder Millionen von Entitäten vorhanden sind. Dies liegt an technischen Einschränkungen in Kafka / Zookeeper.

Einer der Hauptgründe für die Verwendung eines vorübergehenden Schreibmodells auf diese Weise besteht darin, Änderungen der Geschäftslogik kostengünstig und einfach bereitzustellen.

Die Verwendung von Topic-per-Type wird stattdessen für Kafka empfohlen. Dies würde jedoch das Laden von Ereignissen für jede Entität dieses Typs erfordern , nur um Ereignisse für eine einzelne Entität abzurufen. Da Sie anhand der Protokollposition nicht erkennen können, welche Ereignisse zu welcher Entität gehören. Selbst wenn Snapshots verwendet werden , um von einer bekannten Protokollposition aus zu starten, kann dies eine erhebliche Anzahl von Ereignissen sein, die durchlaufen werden müssen.

Fehlende Konflikterkennung

Zweitens können Benutzer aufgrund gleichzeitiger Anforderungen an dieselbe Entität Rennbedingungen erstellen. Es kann durchaus unerwünscht sein, widersprüchliche Ereignisse zu speichern und nachträglich zu beheben. Daher ist es wichtig, widersprüchliche Ereignisse verhindern zu können. Um die Anforderungslast zu skalieren, werden häufig zustandslose Dienste verwendet, während Schreibkonflikte durch bedingte Schreibvorgänge verhindert werden (nur schreiben, wenn das letzte Entitätsereignis #x war). Aka Optimistische Parallelität. Kafka unterstützt keine optimistische Parallelität. Selbst wenn es auf Themenebene unterstützt würde, müsste es bis auf die Entitätsebene reichen, um effektiv zu sein. Um Kafka zu verwenden und widersprüchliche Ereignisse zu vermeiden, müssen Sie auf Anwendungsebene einen statusbehafteten, serialisierten Writer verwenden. Dies ist eine wesentliche architektonische Anforderung / Einschränkung.

Weitere Informationen


Update pro Kommentar

Der Kommentar wurde gelöscht, aber die Frage war ungefähr so: Was verwenden die Leute dann für die Speicherung von Ereignissen?

Es scheint, dass die meisten Leute ihre eigene Ereignisspeicherimplementierung auf eine vorhandene Datenbank rollen. Für nicht verteilte Szenarien wie interne Back-Ends oder eigenständige Produkte ist gut dokumentiert, wie ein SQL-basierter Ereignisspeicher erstellt wird. Darüber hinaus stehen Bibliotheken für verschiedene Arten von Datenbanken zur Verfügung. Es gibt auch EventStore , der für diesen Zweck erstellt wurde.

In verteilten Szenarien habe ich verschiedene Implementierungen gesehen. Das Panther-Projekt von Jet verwendet Azure CosmosDB mit der Funktion "Feed ändern", um Listener zu benachrichtigen. Eine andere ähnliche Implementierung, von der ich in AWS gehört habe, ist die Verwendung von DynamoDB mit seiner Streams-Funktion, um Listener zu benachrichtigen. Der Partitionsschlüssel sollte wahrscheinlich die Stream-ID für die beste Datenverteilung sein (um das Ausmaß der Überbereitstellung zu verringern). Eine vollständige Wiedergabe über Streams in Dynamo ist jedoch teuer (lesbar und kostenmäßig). Daher wurde dieses Gerät auch für Dynamo Streams eingerichtet, um Ereignisse in S3 zu sichern. Wenn ein neuer Listener online geht oder ein vorhandener Listener eine vollständige Wiedergabe wünscht, liest er S3, um zuerst aufzuholen.

Mein aktuelles Projekt ist ein mandantenfähiges Szenario, und ich habe mein eigenes auf Postgres gerollt. So etwas wie Citus scheint für die Skalierbarkeit geeignet zu sein, die Partitionierung durch Tentant + Stream.

Kafka ist in verteilten Szenarien immer noch sehr nützlich. Es ist kein triviales Problem, die Ereignisse jedes Dienstes anderen Diensten auszusetzen. Ein Event-Store ist normalerweise nicht dafür gebaut, aber genau das macht Kafka gut. Jeder Dienst hat seine eigene interne Wahrheitsquelle (kann Ereignisspeicherung oder auf andere Weise sein), hört jedoch auf Kafka, um zu wissen, was "außerhalb" geschieht. Der Dienst kann auch Ereignisse an Kafka senden, um die "Außenwelt" über interessante Dinge zu informieren, die der Dienst getan hat.

Kasey Speakman
quelle
1
@Dominik Ich habe EventStore im Abschnitt Update (2. Absatz) erwähnt. Ich werde zurückgehen und es verlinken. Ich habe es versucht, und es hat beeindruckende Leistung. Für unser kleines Team war es vorerst wichtiger, keine weitere Datenbank einzuführen, daher Postgres (das auch für Ansichten verwendet wird). Es ist möglich, dass wir in Zukunft oder in zukünftigen Produkten zu EventStore wechseln.
Kasey Speakman
2
@KaseySpeakman-Themen sind nicht mit Partitionen identisch. Ein Thema hat eine oder mehrere Partitionen. Partitionen haben zu jedem Zeitpunkt garantiert nur einen Verbraucher pro Gruppe. Partitionieren Sie Ihre Entitäten so, dass Sie dies nutzen können. Sie benötigen kein Thema pro Entität oder sogar eine Partition pro Entität. Sie müssen sie lediglich so partitionieren, dass sichergestellt ist, dass alle an dieselbe Entität gerichteten Befehle an dieselbe Partition gesendet werden.
Andrew Larsson
1
@KaseySpeakman Viele Entitäten können eine einzelne Partition gemeinsam nutzen. Wer hat gesagt, dass Sie den Status der Entität immer direkt aus dem Ereignisspeicher laden müssen, indem Sie die Ereignisse wiedergeben? Es gibt andere Möglichkeiten, dasselbe Konzept zu erreichen, ohne die Implementierung von Greg Young Zeile für Zeile genau zu befolgen.
Andrew Larsson
1
@AndrewLarsson Wenn Sie nicht pro Entität partitionieren, wie können Sie dann widersprüchliche Ereignisse auf Entitätsebene verhindern? Da sich der Kreis zu Parallelitätskonflikten geschlossen hat, sollten Sie vielleicht Ihren eigenen Artikel auf Medium oder etwas darüber veröffentlichen, wie Sie Kafka für die Ereignisbeschaffung (nicht für die Stream-Verarbeitung) in der Produktion verwendet haben. Wie Sie dies mit einer Partition nach Typ und ohne Parallelitätskontrolle auf Entitätsebene erreichen. Ich würde es lesen und ich würde dich nicht einmal in Kommentaren trollen, wenn ich nicht einverstanden wäre.
Kasey Speakman
2
@KaseySpeakman Die Verwendung von Kafka auf diese Weise ist keineswegs einfach. Wenn Sie sich jedoch auf einer Skala befinden, auf der Sie ernsthaft über CQRS und Event Sourcing nachgedacht haben, befinden Sie sich auf einer Skala, auf der Sie es sich nicht leisten können, die Dinge auf einfache Weise zu erledigen. Ihr Parallelitätsmodell wirkt sich direkt auf Ihre Skala aus - wählen Sie keines willkürlich aus. Außerdem ist HTTP kein zuverlässiger Transport. Wenn Sie sich in dieser Größenordnung befinden, können Sie es sich nicht leisten, Zeit damit zu verbringen, verlorene und / oder doppelte Nachrichtenprobleme zu lösen. Dies alles kann durch die Verwendung von Kafka zwischen dem Client und dem Befehlsprozessor gelöst werden, aber ja, dies geht zu Lasten der Komplexität.
Andrew Larsson
20

Sie können Kafka als Event-Store verwenden, aber ich empfehle dies nicht, obwohl es nach einer guten Wahl aussieht:

  • Kafka garantiert nur mindestens eine Lieferung und es gibt Duplikate im Event Store, die nicht entfernt werden können. Update: Hier können Sie lesen, warum es mit Kafka so schwierig ist, und einige aktuelle Nachrichten darüber, wie dieses Verhalten endlich erreicht werden kann: https://www.confluent.io/blog/exactly-once-semantics-are-possible-heres-how -apache-kafka-does-it /
  • Aufgrund der Unveränderlichkeit gibt es keine Möglichkeit, den Ereignisspeicher zu manipulieren, wenn sich die Anwendung weiterentwickelt und Ereignisse transformiert werden müssen (es gibt natürlich Methoden wie Upcasting, aber ...). Einmal könnte man sagen, dass Sie Ereignisse nie transformieren müssen, aber das ist keine korrekte Annahme. Es kann vorkommen, dass Sie eine Sicherungskopie des Originals erstellen, diese jedoch auf die neuesten Versionen aktualisieren. Dies ist eine gültige Anforderung in ereignisgesteuerten Architekturen.
  • Kein Ort, an dem Snapshots von Entitäten / Aggregaten und der Wiedergabe gespeichert werden können, wird langsamer und langsamer. Das Erstellen von Snapshots ist aus langfristiger Sicht ein Muss für den Ereignisspeicher.
  • Angesichts der Tatsache, dass Kafka-Partitionen verteilt sind und im Vergleich zu Datenbanken schwer zu verwalten und zu sichern sind. Datenbanken sind einfach einfacher :-)

Bevor Sie Ihre Wahl treffen, überlegen Sie es sich zweimal. Der Ereignisspeicher als Kombination aus Schnittstellen auf Anwendungsebene (Überwachung und Verwaltung), der SQL / NoSQL-Speicher und Kafka als Broker sind die bessere Wahl, als Kafka beide Rollen zu überlassen, um eine vollständige Lösung mit allen Funktionen zu erstellen.

Event Store ist ein komplexer Service, der mehr erfordert, als Kafka bieten kann, wenn Sie es ernst meinen, Event Sourcing, CQRS, Sagas und andere Muster in ereignisgesteuerter Architektur anzuwenden und eine hohe Leistung zu erzielen.

Fühlen Sie sich frei, meine Antwort herauszufordern! Sie mögen vielleicht nicht, was ich über Ihren Lieblingsbroker mit vielen überlappenden Funktionen sage, aber dennoch wurde Kafka nicht als Event-Store konzipiert, sondern eher als Hochleistungs-Broker und Puffer gleichzeitig, um schnelle Produzenten im Vergleich zu langsamen Konsumentenszenarien zu handhaben. beispielsweise.

Weitere Informationen zu möglichen Problemen finden Sie im Open Source-Framework von eventuate.io microservices: http://eventuate.io/

Update ab dem 8. Februar 2018

Ich beziehe keine neuen Informationen aus Kommentaren ein, stimme aber einigen dieser Aspekte zu. In diesem Update werden einige Empfehlungen für eine ereignisgesteuerte Microservice-Plattform erläutert. Wenn Sie es ernst meinen mit dem robusten Design von Microservice und der höchstmöglichen Leistung im Allgemeinen, werde ich Ihnen einige Hinweise geben, die Sie interessieren könnten.

  1. Verwenden Sie Spring nicht - es ist großartig (ich benutze es selbst oft), aber es ist gleichzeitig schwer und langsam. Und es ist überhaupt keine Microservice-Plattform. Es ist "nur" ein Framework, das Ihnen bei der Implementierung hilft (viel Arbeit dahinter ..). Andere Frameworks sind "nur" leichte REST- oder JPA-Frameworks oder anders fokussierte Frameworks. Ich empfehle die wahrscheinlich beste Open-Source-Plattform für komplette Mikroservices, die auf reine Java-Wurzeln zurückgreift: https://github.com/networknt

Wenn Sie sich über die Leistung wundern, können Sie sich mit der vorhandenen Benchmark-Suite vergleichen. https://github.com/networknt/microservices-framework-benchmark

  1. Benutze Kafka überhaupt nicht :-)) Es ist ein halber Witz. Ich meine, während Kafka großartig ist, ist es ein anderes Broker-zentriertes System. Ich denke, die Zukunft liegt in Broker-freien Messaging-Systemen. Sie werden überrascht sein, aber es gibt schnellere als Kafka-Systeme :-), natürlich müssen Sie auf ein niedrigeres Niveau kommen. Schau dir Chronik an.

  2. Für den Ereignisspeicher empfehle ich die überlegene Postgresql-Erweiterung TimescaleDB, die sich auf die Hochleistungsdatenverarbeitung von Zeitreihen (Ereignisse sind Zeitreihen) in großem Umfang konzentriert. Natürlich sind CQRS-, Event-Sourcing- (Wiedergabe- usw. Funktionen) sofort im light4j-Framework integriert, das Postgres als geringen Speicherplatz verwendet.

  3. Versuchen Sie für Nachrichten, Chronicle Queue, Map, Engine, Network zu betrachten. Ich meine, diese altmodischen, auf Makler ausgerichteten Lösungen loszuwerden und sich für ein Micro-Messaging-System (eingebettetes) zu entscheiden. Chronicle Queue ist sogar noch schneller als Kafka. Aber ich bin damit einverstanden, dass es nicht alles in einer Lösung ist und Sie einige Entwicklungen durchführen müssen, sonst kaufen Sie die Enterprise-Version (kostenpflichtig). Am Ende wird der Aufwand für die Erstellung Ihrer eigenen Messaging-Schicht aus Chronicle bezahlt, indem die Wartung des Kafka-Clusters entfällt.

Kensai
quelle
Interessante Aussicht. Möchten Sie einige Punkte näher erläutern? > Kafka garantiert nur, dass mindestens einmal geliefert wird, und es gibt Duplikate im Ereignisspeicher, die nicht entfernt werden können. Sie scheinen zu implizieren, dass es genau eine Lieferung gibt. afaik (und da bin ich mir ziemlich sicher) gibt es so etwas in einem verteilten System nicht. 2) In Bezug auf Ihren Punkt 2: Die klassische Schule des (Event Sourcing / dddd) Denkens ist, dass Ereignisse von Natur aus unveränderlich sind. Dh: Sie sind passiert, keine Möglichkeit, die Vergangenheit zu ändern. Was ist der eigentliche Anwendungsfall, um sie im Nachhinein zu ändern? Vielen Dank!
Geert-Jan
1.) Hazelcast, um sicherzustellen, dass jede Nachricht einmal und nur einmal verarbeitet wird. 2.) Ich mag nichts wie _V2 im Service-Code. Entweder werden Sie sichern, um alte Ereignisse zu archivieren und in ihren neuen Versionen neu zu erstellen (Sie haben immer noch die ursprüngliche Wahrheit), oder Sie können diese Funktionalität direkt in Event ausblenden / einbauen Speichern Sie die Snapshot-Funktionalität, sodass es einen einzigen Punkt für das Upcasting gibt -> den Ereignisspeicher. Was sind Ihre Lösungen dafür?
Kensai
1) mindestens einmal + Idempotenz beim Verbraucher. Dh: Überprüfen Sie, ob das Ereignis bereits gesehen wurde. Wenn ja, überspringen. Oder noch besser, haben Sie idempotente Handlungen. Dies ist natürlich nicht immer möglich. 2) Ich habe noch nie festgestellt, dass Ereignisse versioniert werden müssen. Ich betrachte die Ereignisse selbst immer als Quelle der Wahrheit und füge alle Informationen hinzu, die ich jemals dazu benötigen würde. Dabei bin ich nie auf eine Situation gestoßen, in der ich eine andere Ereignisstruktur und / oder Daten zu einem Ereignis benötigte. Aber vielleicht ymmv. Sie möchten wissen, in welchen Situationen Sie tatsächlich aktualisierte Ereignisse benötigen würden.
Geert-Jan
1.) kann ein Weg der Wahl sein .. 2.) dann waren deine Datenstrukturen von Anfang an perfekt :-) Glück gehabt, haha. Ich brauche es vielleicht nicht für mein aktuelles Projekt, aber ich baue eine ganze Plattform auf Gabeln von eventuate.io auf, die mit einigen Hochleistungs-JEE-Ansätzen zusammengeführt sind, die nur aus light eventuate 4j stammen ... diese ganze Diskussion ist kein Ort für Kommentare zum Stapelüberlauf , aber wenn Sie daran interessiert sind, tiefer zu tauchen, empfehle ich diesen Artikel: leanpub.com/esversioning/read
kensai
1
Kafka unterstützt übrigens jetzt genau einmal die Lieferung. Update Bullet 1
OneCricketeer
8

Ja, Sie können Kafka als Event Store verwenden. Dies funktioniert recht gut, insbesondere mit der Einführung von Kafka-Streams , die eine Kafka-native Möglichkeit bieten, Ihre Ereignisse in einen akkumulierten Zustand zu verarbeiten, den Sie abfragen können .

Hinsichtlich:

Möglichkeit zur Wiedergabe des Ereignisprotokolls, wodurch sich neue Abonnenten nachträglich beim System registrieren können.

Dies kann schwierig sein. Ich habe das hier ausführlich behandelt: https://stackoverflow.com/a/48482974/741970

Dmitry Minkovsky
quelle
0

Ja, Kafka funktioniert gut im Event-Sourcing-Modell, speziell CQRS. Sie müssen jedoch beim Festlegen von TTLs für Themen vorsichtig sein und immer bedenken, dass Kafka nicht für dieses Modell entwickelt wurde. Wir können es jedoch sehr gut verwenden.

Brijendra Verma
quelle
0

Ich denke, Sie sollten sich das Axon-Framework zusammen mit ihrer Unterstützung für Kafka ansehen

Darshu Bc
quelle