Laut der Kafka-Site :
" Kakfa wird zum Erstellen von Echtzeit-Datenpipelines und Streaming-Apps verwendet. "
Ich habe weit und breit im Internet gesucht und die folgende allgemein akzeptierte Definition von " Stream-Daten " gefunden:
- Stream-Daten sind Daten, die über ein Netzwerk zusammenhängend von einer Quelle zu einem Ziel fließen. und
- Stream-Daten sind nicht atomarer Natur, was bedeutet, dass ein Teil eines fließenden Datenstroms sinnvoll und verarbeitbar ist, im Gegensatz zu einer Datei, deren Bytes nichts bedeuten, es sei denn, Sie haben alle. und
- Stream-Daten können jederzeit gestartet / gestoppt werden. und
- Verbraucher können nach Belieben einen Datenstrom anhängen und von diesem trennen und nur die Teile verarbeiten, die sie möchten
Wenn etwas, was ich oben gesagt habe, falsch, unvollständig oder völlig falsch ist, korrigieren Sie mich bitte zunächst! Angenommen, ich bin mehr oder weniger auf dem richtigen Weg, dann ...
Jetzt, da ich verstehe, was "Streaming-Daten" sind, verstehe ich, was Kafka und Kinesis bedeuten, wenn sie sich selbst als Verarbeitungs- / Vermittlungs-Middleware für Anwendungen mit Streaming-Daten in Rechnung stellen. Aber es hat meine Interessen geweckt: Kann / sollte "Stream-Middleware" wie Kafka oder Kinesis für Nicht-Streaming-Daten wie herkömmliche Nachrichtenbroker verwendet werden? Und umgekehrt: Können / sollten herkömmliche MQs wie RabbitMQ, ActiveMQ, Apollo usw. zum Streamen von Daten verwendet werden?
Nehmen wir ein Beispiel, in dem eine Anwendung ihr Backend mit einer konstanten Flut von JSON-Nachrichten sendet, die verarbeitet werden müssen, und die Verarbeitung ziemlich komplex ist (Validierung, Transformation der Daten, Filterung, Aggregation usw.):
- Fall 1: Die Nachrichten sind jeweils Frames eines Films. Dies ist eine JSON-Nachricht pro Videorahmen, die die Rahmendaten und einige unterstützende Metadaten enthält
- Fall 2: Die Nachrichten sind Zeitreihendaten, möglicherweise der Herzschlag einer Person als Funktion der Zeit. Es wird also Nachricht Nr. 1 gesendet, die meinen Herzschlag bei t = 1 darstellt, Nachricht Nr. 2 enthält meinen Herzschlag bei t = 2 usw.
- Fall 3: Die Daten sind zeitlich oder als Teil eines "Datenstroms" völlig unterschiedlich und nicht miteinander verbunden. Möglicherweise werden Prüfungs- / Sicherheitsereignisse ausgelöst, wenn Hunderte von Benutzern durch die Anwendung navigieren, auf Schaltflächen klicken und Maßnahmen ergreifen
Basierend auf der Abrechnung von Kafka / Kinesis und meinem Verständnis von "Streaming-Daten" scheinen sie offensichtliche Kandidaten für die Fälle Nr. 1 (zusammenhängende Videodaten) und Nr. 2 (zusammenhängende Zeitreihendaten) zu sein. Ich sehe jedoch keinen Grund, warum ein traditioneller Nachrichtenbroker wie RabbitMQ diese beiden Eingaben nicht effizient verarbeiten kann.
In Fall 3 erhalten wir nur ein Ereignis, das aufgetreten ist, und wir müssen eine Reaktion auf dieses Ereignis verarbeiten. Für mich bedeutet dies, dass ich einen traditionellen Broker wie RabbitMQ brauche. Es gibt aber auch keinen Grund, warum Kafka oder Kinesis die Verarbeitung von Ereignisdaten nicht übernehmen könnten.
Im Grunde möchte ich eine Rubrik erstellen , die besagt: Ich habe X-Daten mit Y-Eigenschaften. Ich sollte einen Stream-Prozessor wie Kafka / Kinesis verwenden, um damit umzugehen. Oder umgekehrt eine, die mir hilft festzustellen: Ich habe W-Daten mit Z-Eigenschaften. Ich sollte einen traditionellen Nachrichtenbroker verwenden, um damit umzugehen.
Also frage ich: Welche Faktoren über die Daten (oder auf andere Weise) helfen dabei, die Entscheidung zwischen Stream-Prozessor oder Nachrichtenbroker zu steuern, da beide Streaming-Daten und beide (Nicht-Streaming-) Nachrichtendaten verarbeiten können?
Kafka / Kinesis wird als Stream modelliert. Ein Stream hat andere Eigenschaften als Nachrichten.
Verwenden Sie Kafka im Allgemeinen für die Offline-Stream-Verarbeitung und Nachrichtenwarteschlangen für Client-Server-Nachrichten in Echtzeit.
Beispielanwendungsfälle von Pivotal :
Es kann manchmal nützlich sein, beide zu verwenden! Wenn dies beispielsweise in Anwendungsfall 2 ein Datenstrom von einem Schrittmacher wäre, würde ich den Schrittmacher veranlassen, Heartbeat-Daten an eine RabbitMQ-Nachrichtenwarteschlange (unter Verwendung eines coolen Protokolls wie MQTT) zu senden, in die sie sofort verarbeitet werden Sehen Sie, ob das Herz der Quelle noch schlägt. Dies könnte ein Armaturenbrett und ein Notfallreaktionssystem mit Strom versorgen. Die Nachrichtenwarteschlange würde auch die Zeitreihendaten in Kafka ablegen, damit wir die Heartbeat-Daten über die Zeit analysieren können. Zum Beispiel könnten wir einen Algorithmus implementieren, um Herzkrankheiten zu erkennen, indem wir Trends im Herzschlagstrom bemerken.
quelle
KafkaProducer
,Kafka
undKafkaConsumer
. Angenommen, erKafkaProducer
lebt in einer Java-App undKafkaConsumer
läuft auf einer Ruby-App / einem Ruby-Backend.KafkaProducer
sendetMessage1
an Kafka, die über transformiert werden mussFunction1
. Wo lebtFunction1
der Code? Auf Kafka (richtig) oder innerhalbKafkaConsumer
(der Ruby-App)?