storm spouts sleep()还是yield()?

iqxoj9l9  于 2021-06-24  发布在  Storm
关注(0)|答案(1)|浏览(332)

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使用。

i5desfxk

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 要解决此问题:)

相关问题