nexttuple()的storm文档说明如下:
当没有元组发出时,有礼貌的做法是在短时间内(比如一毫秒)进行下一次双倍睡眠,以免浪费太多cpu。
似乎有一种方法可以解决这个问题 Utils.class
: Utils.sleep(long millis)
.
然而,在apache storm自己提供的一个喷口中, MqttSpout
,使用不同的方法:
public void nextTuple() {
AckableMessage tm = this.incoming.poll();
if(tm != null){
...
} else {
Thread.yield();
}
}
我怀疑风暴的作者可能在那里犯了一个错误,因为 Thread.yield()
文件中有以下注解:
对调度程序的一个提示,表示当前线程愿意放弃当前对处理器的使用。调度程序可以随意忽略此提示。
和
使用这种方法很少合适。
我应该用哪一个?我怀疑使用 Thread.yield()
会导致不必要的cpu使用。
1条答案
按热度按时间i5desfxk1#
你的嘴根本不该睡觉。storm将处理nexttuple调用之间的睡眠,如果您在调用期间不发出任何消息,至少在我熟悉的版本中是1.0.0和forward。
看到了吗https://github.com/apache/storm/blob/v1.2.2/storm-core/src/clj/org/apache/storm/daemon/executor.clj#l667 供参考。等待策略的默认实现在每次调用时休眠一个可配置的间隔(默认1ms)。你可以用https://github.com/apache/storm/blob/v1.2.2/storm-core/src/jvm/org/apache/storm/config.java#l1886 或者将等待策略完全替换为https://github.com/apache/storm/blob/v1.2.2/storm-core/src/jvm/org/apache/storm/config.java#l1879.
Storm2.0.0将有一个稍微不同的行为(逐渐延长睡眠时间),但它的基本思想是相同的。
我认为nexttuple的javadoc是误导性的,所以我们可能应该修改它。我也不确定
Thread.yield
是在mqtt喷口里做的。它看起来像是在那里,因为喷口被添加。如果你在邮件列表上问(https://storm.apache.org/getting-help.html),作者仍然在附近,也许知道它为什么在那里。如果你愿意,你可以在https://issues.apache.org/jira/secure/dashboard.jspa 要解决此问题:)