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.
quelle
Antworten:
Kafka soll ein Messaging-System sein, das viele Ähnlichkeiten mit einem Event-Store aufweist, um jedoch deren Intro zu zitieren:
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 :
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.
quelle
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 .
quelle
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.
quelle
Sie können Kafka als Event-Store verwenden, aber ich empfehle dies nicht, obwohl es nach einer guten Wahl aussieht:
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.
Wenn Sie sich über die Leistung wundern, können Sie sich mit der vorhandenen Benchmark-Suite vergleichen. https://github.com/networknt/microservices-framework-benchmark
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.
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.
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.
quelle
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:
Dies kann schwierig sein. Ich habe das hier ausführlich behandelt: https://stackoverflow.com/a/48482974/741970
quelle
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.
quelle
Ich denke, Sie sollten sich das Axon-Framework zusammen mit ihrer Unterstützung für Kafka ansehen
quelle