2016-04-20 16 views
1

Ich habe eine Schraube, die Daten von anderen Schrauben sammeln wird. Sobald genügend Daten in der Schraube vorhanden sind oder die Zeitschaltuhr erreicht ist, führt diese Schraube einige zeitaufwendige Aufgaben basierend auf den gesammelten Daten aus.Gewinde sicher Sturmschraube

Meine Frage ist, während der zeitaufwändigen Arbeiten, andere Schrauben sollten weiter Daten an diese Schraube senden, würde dies ein thread-sicheres Problem verursachen? Muss ich eine Sperre hinzufügen, wenn zeitraubende Jobs ausgeführt werden?

Es gibt einen ähnlichen Beitrag here, aber ich verstehe die Antwort nicht.

Betrachtet man die Anzahl der Wörter unten und sagen wir, es hat nur eine Instanz, wenn eine Nachricht diese Schraube erreicht hat, wird sie sofort angekreuzt. Da die Karte leer ist, wird dann ein zeitaufwendiger Job gestartet. In der Zwischenzeit laufen nach meinem Verständnis noch andere Tüllen/Bolzen und senden weiterhin Nachrichten an diesen Riegel. Da die erste Nachricht jedoch noch nicht auf der Karte steht, werden diese neuen Nachrichten den zeitaufwändigen Job immer wieder starten. Wäre das nicht ein Thread-sicheres Problem?

public static class WordCount extends BaseRichBolt { 
    Map<String, Integer> counts = new HashMap<String, Integer>(); 

    @Override 
    public void execute(Tuple tuple) { 
     collect.ack(tuple); // ack upon receiving the message 
     String word = tuple.getString(0); 
     Integer count = counts.get(word); 
     if (count == null){ 
     // doing time-consuming job here 
     count = 0; 
     } 
     count++; 
     counts.put(word, count); 
     collector.emit(new Values(word, count)); 
    } 
    } 
+0

Einige Kommentare/Ratschläge bezüglich Ihres Codes: Sie könnten eine Batch-Schraube verwenden, die genau für diese Szenarien erstellt wurde (Sammeln von Daten und Batch-Ausführung). Sie sollten ack _after_ die Daten verarbeitet werden und nicht vorher (siehe Beispiele [hier] (http://storm.apache.org/releases/1.0.0/Guaranteeing-message-processing.html)). – thisismydesign

Antwort

1

Sturmschrauben sind fadensicher (link). Senden von Daten an Schrauben, während sie Zeit conusming Operationen durchführen, ist in Ordnung. Du kannst die Kapazität deines Bolzens in Storm UI erhöhen und wenn es kämpft, einfach Paralelismus erhöhen.

+0

Betrachtet man eine Instanz von Bolzen, wenn die Ausführungsfunktion zeitaufwendige Aufgaben ausführt, wird es dann einen anderen Ausführungsaufruf durch andere Schrauben/Ausläufe geben? Was ist der zeitaufwendige Job auf Anhieb? –

+0

Können Sie Ihre Frage neu formulieren? Ich verstehe nicht, was du fragen willst. – f1sherox

+0

Ich habe ein Beispiel hinzugefügt. Hoffe es ist einfacher, meine Frage zu verstehen. –