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.