Einführung
Ich habe mich entschlossen, einen Artikel zu analysieren , der einige interessante Details der Streaming-Verarbeitung genau einmal beschreibt: genau einmal . Tatsache ist, dass einige Autoren die Begriffe sehr seltsam verstehen. Die Analyse des Artikels wird es uns ermöglichen, viele Details tiefer zu klären, weil Durch das Erkennen von Inkonsistenzen und Kuriositäten können Sie die Konzepte und Bedeutungen besser kennenlernen.
Fangen wir an.
Analyse
Alles beginnt sehr gut:
Die verteilte Ereignisstromverarbeitung ist im Bereich Big Data zu einem immer heißeren Thema geworden. Zu den bemerkenswerten Stream Processing Engines (SPEs) gehören Apache Storm, Apache Flink, Heron, Apache Kafka (Kafka Streams) und Apache Spark (Spark Streaming). Eines der bemerkenswertesten und am meisten diskutierten Merkmale von SPEs ist ihre Verarbeitungssemantik, wobei "genau einmal" eine der gefragtesten ist und viele SPEs behaupten, "genau einmal" Verarbeitungssemantik bereitzustellen.
Das heißt, die Datenverarbeitung ist äußerst wichtig usw., und das diskutierte Thema ist genau einmal. Lassen Sie uns darüber diskutieren.
Es gibt jedoch viele Missverständnisse und Unklarheiten darüber, was genau „genau einmal“ ist, was es bedeutet und was es wirklich bedeutet, wenn einzelne SPEs behaupten, es bereitzustellen.
In der Tat ist es sehr wichtig zu verstehen, was es ist. Um dies zu tun, wäre es schön, vor langen Überlegungen die richtige Definition zu geben. Und wer bin ich, der so verdammt gute Ratschläge gibt?
Ich werde diskutieren, wie sich die Verarbeitungssemantik „genau einmal“ in vielen gängigen SPEs unterscheidet und warum „genau einmal“ besser als effektiv einmal beschrieben werden kann
Neue Begriffe zu erfinden ist natürlich eine wichtige Aufgabe. Ich liebe dieses Ding selbst. Nur dafür ist eine Begründung erforderlich. Versuchen wir ihn zu finden.
Ich werde die offensichtlichen Dinge nicht als gerichtete Verarbeitungsgraphen usw. beschreiben. Leser können den Originalartikel selbst lesen. Darüber hinaus sind für die Analyse dieser Details irrelevant. Ich werde nur ein Bild geben:

Als nächstes folgt eine Beschreibung der Semantik:
- Höchstens einmal, d.h. nicht mehr als einmal. Angesichts der offensichtlichen Offensichtlichkeit ist es äußerst schwierig, ein solches Verhalten in Grenzszenarien wie Abstürzen, Unterbrechungen der Netzwerkkonnektivität und mehr zu gewährleisten. Aber für den Autor ist alles einfach:

- Mindestens einmal, d.h. mindestens einmal. Das Schema ist komplexer. Und der Rechen kann mehr gesammelt werden:

- Genau einmal. Was ist genau einmal?
Ereignisse werden von allen Bedienern in der Stream-Anwendung garantiert „genau einmal“ verarbeitet, auch bei verschiedenen Fehlern.
Das heißt, Die Garantie für eine genau einmalige Verarbeitung besteht, wenn die Verarbeitung "genau einmal" erfolgt ist.
Fühlen Sie die Kraft der Entschlossenheit? Umformulieren: Einmalige Verarbeitung ist, wenn die Verarbeitung "einmalig" erfolgt. Ja, es heißt auch, dass diese Garantie im Falle eines Ausfalls erhalten bleiben sollte. Für verteilte Systeme ist dies jedoch eine offensichtliche Sache. Und die Anführungszeichen deuten darauf hin, dass hier etwas nicht stimmt. Das Definieren mit Anführungszeichen, ohne zu erklären, was dies bedeutet, ist ein Zeichen für einen tiefen und nachdenklichen Ansatz.
Das Folgende ist eine Beschreibung, wie eine solche Semantik implementiert wird. Und hier möchte ich näher darauf eingehen.
Zwei beliebte Mechanismen werden normalerweise verwendet, um eine "genau einmalige" Verarbeitungssemantik zu erreichen.
- Verteilter Snapshot / State Checkpointing
- Mindestens einmalige Ereigniszustellung plus Nachrichtendeduplizierung
Wenn der erste Mechanismus in Bezug auf Schnappschüsse und Prüfpunkte keine Fragen aufwirft, abgesehen von einigen Details wie der Effizienz, gibt es kleine Probleme mit dem zweiten, die der Autor ignoriert hat.
Aus irgendeinem Grund versteht es sich, dass ein Handler nur deterministisch sein kann. Im Fall eines nicht deterministischen Handlers liefert jeder nachfolgende Neustart im Allgemeinen andere Ausgabewerte und -zustände, was bedeutet, dass die Deduplizierung nicht funktioniert, weil Ausgabewerte sind unterschiedlich. Somit wird der allgemeine Mechanismus viel komplizierter sein als im Artikel beschrieben. Oder ehrlich gesagt ist ein solcher Mechanismus falsch.
Wir wenden uns jedoch dem leckersten zu:
Ist genau einmal wirklich genau einmal?
Lassen Sie uns nun noch einmal untersuchen, was die "genau einmalige" Verarbeitungssemantik dem Endbenutzer wirklich garantiert. Das Label „genau einmal“ beschreibt irreführend, was genau einmal gemacht wird.
Es wird gesagt, dass es Zeit ist, dieses Konzept zu überdenken, als Es gibt einige Inkonsistenzen.
Einige denken vielleicht, dass "genau einmal" die Garantie für die Ereignisverarbeitung beschreibt, bei der jedes Ereignis im Stream nur einmal verarbeitet wird. In der Realität gibt es keine SPE, die eine genau einmalige Verarbeitung garantieren kann. Die Garantie, dass die benutzerdefinierte Logik in jedem Operator nur einmal pro Ereignis ausgeführt wird, ist angesichts willkürlicher Fehler unmöglich, da eine teilweise Ausführung des Benutzercodes eine allgegenwärtige Möglichkeit ist.
Sehr geehrter Autor, es lohnt sich daran zu erinnern, wie moderne Prozessoren funktionieren. Jeder Prozessor in der Verarbeitung führt eine große Anzahl paralleler Stufen aus. Darüber hinaus gibt es Zweige, in denen der Prozessor beginnt, die falschen Aktionen auszuführen, wenn der Verzweigungsprädiktor falsch ist. In diesem Fall werden die Aktionen zurückgesetzt. Somit kann der Prozessor denselben Code zweimal ausführen, auch wenn keine Fehler aufgetreten sind!
Der aufmerksame Leser wird sofort ausrufen: Weil Auspuff wichtig ist und nicht, wie er ausgeführt wird. Genau! Was zählt, ist, was als Ergebnis passiert ist, nicht wie es tatsächlich passiert ist. Wenn das Ergebnis so ist, als ob es genau einmal passiert wäre, bedeutet dies, dass es genau einmal passiert ist. Nicht finden? Und alles andere ist Schale, irrelevant. Systeme sind komplex und die daraus resultierenden Abstraktionen erzeugen in gewisser Weise nur die Illusion der Ausführung. Es scheint uns, dass der Code sequentiell ausgeführt wird, Befehl für Befehl, der zuerst liest, dann schreibt, dann einen neuen Befehl. Das ist aber nicht so, alles ist viel komplizierter. Und die Essenz korrekter Abstraktionen besteht darin, die Illusion einfacher und verständlicher Garantien aufrechtzuerhalten, ohne jedes Mal tief in die Sache einzusteigen, wenn Sie einer Variablen Werte zuweisen müssen.
Und das ganze Problem dieses Artikels liegt in der Tatsache, dass genau einmal eine Abstraktion ist, mit der Sie Anwendungen erstellen können, ohne an Duplikate und verlorene Werte zu denken. Dass auch im Herbst alles gut wird. Und dafür müssen keine neuen Begriffe erfunden werden.
Der Beispielcode im Artikel zeigt deutlich, dass das Verständnis für das Schreiben von Handlern nicht ausreichend ist:
Map (Event event) { Print "Event ID: " + event.getId() Return event }
Der Leser wird gebeten, den Code unabhängig umzuschreiben, um die Fehler des Autors des Artikels nicht zu wiederholen.
Was garantieren SPEs, wenn sie eine „genau einmalige“ Verarbeitungssemantik beanspruchen? Wenn nicht garantiert werden kann, dass die Benutzerlogik genau einmal ausgeführt wird, was wird dann genau einmal ausgeführt? Wenn SPEs eine "genau einmalige" Verarbeitungssemantik beanspruchen, sagen sie tatsächlich, dass sie garantieren können, dass Aktualisierungen des von der SPE verwalteten Status nur einmal in einem dauerhaften Backend-Speicher festgeschrieben werden.
Der Benutzer benötigt keine Garantie für die physische Ausführung des Codes. Wenn Sie wissen, wie der Prozessor funktioniert, können Sie leicht den Schluss ziehen, dass dies nicht möglich ist. Die Hauptsache ist die logische Ausführung genau einmal, als ob es überhaupt keine Fehler gäbe. Das Anziehen der Konzepte "Commit to Data Warehouse" verschlimmert nur das mangelnde Verständnis des Autors für grundlegende Dinge, weil Es gibt Implementierungen einer solchen Semantik, ohne dass ein Commit erforderlich ist.
Für weitere Informationen können Sie meinen Artikel kurz lesen: Heterogene wettbewerbsfähige Datenverarbeitung in Echtzeit streng einmal .
Mit anderen Worten, die Verarbeitung eines Ereignisses kann mehr als einmal erfolgen, aber der Effekt dieser Verarbeitung wird nur einmal im dauerhaften Backend-Statusspeicher wiedergegeben.
Dass es für den Benutzer einen "dauerhaften Backend-State-Store" gibt, ist absolut violett. Nur der Effekt der Verarbeitung ist wichtig, d.h. Konsistenz- und Ausgabewerte über den gesamten Zeitraum der Verarbeitung von Streaming-Daten. Es ist erwähnenswert, dass für einige Aufgaben kein dauerhafter Backend-State-Store erforderlich ist, und es wäre schön, genau einmal zu garantieren.
Hier bei Streamlio haben wir entschieden, dass effektiv einmal der beste Begriff für die Beschreibung dieser Verarbeitungssemantik ist.
Ein typisches Beispiel für eine dumme Eingabe von Konzepten: Wir werden einige Beispiele und langwierige Argumente für einen ganzen Absatz schreiben und am Ende hinzufügen, dass „wir dieses Konzept definieren“. Die Genauigkeit und Klarheit der Definitionen führt zu einer wirklich lebendigen emotionalen Reaktion.
Schlussfolgerungen
Ein Missverständnis des Wesens von Abstraktionen führt zu einer Verzerrung der ursprünglichen Bedeutung bestehender Konzepte und der anschließenden Schaffung neuer Begriffe von Grund auf neu.
[1] Genau einmal ist NICHT genau dasselbe .
[2] Heterogene wettbewerbsfähige Echtzeit-Datenverarbeitung nur einmal .