我有一个螺栓,可以从其他螺栓中收集数据。一旦螺栓中有足够的数据或达到时钟,该螺栓将根据收集的数据执行一些耗时的工作。
我的问题是,在耗时的工作中,其他螺栓应该继续向这个螺栓发送数据,这是否会导致线程安全问题?在运行耗时的工作时是否需要添加锁?
有一篇类似的帖子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));
}
}
答案 0 :(得分:2)
Storm Bolts是线程安全的(link)。 在执行时间运算操作时将数据发送到螺栓是可以的。你可以在Storm UI中掌握你的螺栓容量,如果它挣扎,只需增加并行性。