2 Stimmen

Sollten Storm-Spouts nur Ausgaben generieren, wenn der Thread, der Spout.nextTuple aufruft, ausgeführt wird?

Das ISpout.nextTuple() javadoc spezifiziert, dass nextTuple(), ack(...) und fail(...) auf demselben Thread aufgerufen werden.

Der tatsächliche Collector, auf den emit(...) aufgerufen wird, wird jedoch früher als Parameter auf open(..., collector) bereitgestellt.

Die Frage ist, ob ein Hintergrundthread, der neue Daten sieht, diese immer für nextTuple() zur Entgegennahme und Ausgabe einreihen muss. Was würde passieren, wenn der Hintergrundthread die Daten sofort ausgibt? Wird das unterstützt? Falls dies erlaubt ist, was ist der empfohlene Weg, um "für eine kurze Zeit zu schlafen" in nextTuple() zu implementieren?

3voto

Niranjan Sarvi Punkte 889

Die implizite Bedeutung der Methoden nextTuple()/ack()/fail(), die auf demselben Thread aufgerufen werden, ist, dass die Aufgabe (Hintergrund-Java-Thread), die auf der Maschine 'A' läuft und das Tuple emittiert, dieselbe Aufgabe ist, die auf 'A' läuft und auf der ack()/fail() je nach Erfolg/Fehlschlag der Verarbeitung (durch den Bolt, der auf 'B' oder 'C' läuft) des Tuples in der Topologie aufgerufen wird.

Solange die messageId nicht null ist und die Bolt-Aufgaben das ack(tuple) in der execute() Methode aufrufen, verfolgt das Storm-Framework die Tupeltraversierung innerhalb der Topologie und ruft das ack()/fail() der besitzenden Aufgabe des Tupels auf.

Hier ist eine kurze Einführung darüber, wie der Hintergrund-Task-Thread funktioniert, bevor ich Ihre Frage beantworte. Der Hintergrund-Task-Thread verfügt über eine In-Memory-Struktur/Buffer für das emittierte Tuple und einige andere In-Memory-Strukturen für Status/ausstehende Tupel usw. Der Buffer füllt sich, wenn der Spout/Bolt beginnt, die Daten zu emittieren, und dieser Buffer wird freigegeben, wenn die Tupel verarbeitet werden, d.h. nach dem Aufrufen von ack()/fail(). Im Wesentlichen ruft der Hintergrund-Thread nextTuple() auf, wenn der Buffer frei ist, und der Hintergrund-Thread hört auf, nextTuple() aufzurufen, sobald der Buffer voll ist. Mit anderen Worten füllt die emit() Methode entweder in der open()/nextTuple()/close() den Hintergrund-Thread-Buffer auf und ack()/fail() gibt den Buffer frei.

Mit der obigen Erklärung ist der Hintergrund-Thread nicht über die neuen/eintreffenden Daten informiert. Es liegt an der Logik innerhalb des nextTuple(), die Daten von der Quelle (Twitter/JMS-Provider/ESB/AMQP-kompatible Server/RDBMS) zu lesen und die Daten zu emittieren. Abhängig von der Größe des Hintergrund-Thread-Buffers ruft Storm wie oben erklärt nextTuple() auf.

Für andere Fragen ist es in Ordnung, für kurze Zeit zu pausieren, wenn dies erforderlich ist. Bitte beachten Sie, dass nextTuple() den Wert nicht emittieren muss, sondern auch mit nichts zurückkehren kann.

1voto

Meines Verständnisses nach sollte man keine Daten senden, es sei denn, Storm fordert sie an, indem es die nextTuple () Methode aufruft. Folglich muss Ihr Hintergrundthread neue Daten in die Warteschlange stellen, damit sie gesendet werden, wenn sie angefordert werden. Ihre nextTuple() Methode sollte nur kurz schlafen, wenn keine Tupel vorhanden sind, die gesendet werden sollen, wenn die Methode aufgerufen wird.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X