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));
}
}
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