2016-04-20 14 views
1

私は他のボルトからデータを収集するボルトを持っています。ボルトに十分なデータがあるか、時間が経過すると、このボルトは収集されたデータに基づいて時間のかかる作業を行います。ストームボルトのスレッドセーフ

私の質問は、時間のかかる仕事の中で、他のボルトがこのボルトにデータを送信し続けなければならないということです。これはスレッドセーフな問題を引き起こしますか?時間のかかるジョブを実行するときにロックを追加する必要がありますか?

類似の投稿hereがありますが、私はその答えを理解できません。

以下の語数のボルトを考えてみましょう.1つのメッセージがこのボルトに到達するとすぐに1つのインスタンスにしかアクセスできません。マップは空であるため、時間のかかる仕事を開始します。その間、私の理解では、他のスパウト/ボルトはまだ実行されており、このボルトにメッセージを送っています。しかし、最初のメッセージはまだマップされていないので、これらの新しいメッセージは時間のかかる作業を何度も繰り返すでしょう。これはスレッドセーフな問題を引き起こしませんか?

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

あなたのコードに関するいくつかのコメント/アドバイス:正確にこれらのシナリオのために作られたバッチボルトを使用することができます(データ収集とバッチ実行)。あなたはデータが処理された後には直ちに応答するべきです(例[here](http://storm.apache.org/releases/1.0.0/Guaranteeing-message-processing.html)を参照)。 – thisismydesign

答えて

1

ストームボルトはスレッドセーフです(link)。 時間のconusming操作を実行している間、ボルトにデータを送信することはOKです。あなたはStormのUIであなたのボルトの能力を賞賛することができます、それが苦労している場合は、単にパラレルを増やしてください。

+0

ボルトのインスタンスを考えると、実行関数が時間のかかる作業をしている場合、他のボルト/吐き出し口によって別の実行呼び出しが行われますか?最初は時間がかかる仕事は何ですか? –

+0

あなたはあなたの質問を再構成できますか?私はあなたが尋ねたいものを理解していません。 – f1sherox

+0

私は例を追加しました。私の質問を理解してほしいと思っています。 –

関連する問題