风暴螺栓的螺纹安全

时间:2016-04-20 07:17:24

标签: multithreading apache-storm

我有一个螺栓,可以从其他螺栓中收集数据。一旦螺栓中有足够的数据或达到时钟,该螺栓将根据收集的数据执行一些耗时的工作。

我的问题是,在耗时的工作中,其他螺栓应该继续向这个螺栓发送数据,这是否会导致线程安全问题?在运行耗时的工作时是否需要添加锁?

有一篇类似的帖子here,但我不明白答案。

考虑下面的单词计数螺栓,假设它只有一个实例,当一条消息到达此螺栓时,它会立即响应。由于Map是空的,因此它将启动耗时的工作。与此同时,根据我的理解,其他喷口/螺栓现在仍在运行,并继续向此螺栓发送消息。但是,由于第一条消息尚未映射到地图,这些新消息将一次又一次地启动耗时的作业。这不会导致线程安全问题吗?

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

1 个答案:

答案 0 :(得分:2)

Storm Bolts是线程安全的(link)。 在执行时间运算操作时将数据发送到螺栓是可以的。你可以在Storm UI中掌握你的螺栓容量,如果它挣扎,只需增加并行性。