代码之家  ›  专栏  ›  技术社区  ›  JohnEye vikx01

风暴应该喷睡眠()还是产量()?

  •  1
  • JohnEye vikx01  · 技术社区  · 7 年前

    nexttuple()的storm文档说明了以下内容:

    当没有元组可以发出时,有礼貌的做法是在短时间内(如一毫秒)进行下一次两次睡眠,以免浪费太多CPU。

    Utils.class : Utils.sleep(long millis) .

    然而,在阿帕奇风暴本身提供的一个喷口中, MqttSpout ,使用不同的方法:

    public void nextTuple() {
        AckableMessage tm = this.incoming.poll();
        if(tm != null){
            ...
        } else {
            Thread.yield();
        }
    }
    

    我怀疑《风暴》的作者可能在那里犯了一个错误,因为 Thread.yield() 文档本身包含以下注释:

    向调度程序提示当前线程愿意产生当前对处理器的使用。调度程序可以忽略此提示。

    很少适合使用这种方法。

    那么我应该用哪一个呢?我怀疑使用 thread.yield()。 会导致不必要的CPU使用。

    1 回复  |  直到 7 年前
        1
  •  3
  •   Stig Rohde Døssing    7 年前

    你的嘴根本不该睡觉。如果您在通话过程中没有发出任何信号,至少在我熟悉的1.0.0和Forward版本中,Storm将处理对Nextuple的呼叫之间的休眠。

    https://github.com/apache/storm/blob/v1.2.2/storm-core/src/clj/org/apache/storm/daemon/executor.clj#L667 供参考。等待策略的默认实现在每次调用时休眠一个可配置的间隔(默认为1毫秒)。你可以用 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 .

    暴风2.0.0将有一个稍微不同的行为(逐渐更长的睡眠),但它是相同的基本理念。

    我认为javadocfornextuple有误导性,所以我们应该修改它。我也不确定 Thread.yield 正在MQTT喷口中执行。它看起来像是在添加了喷口之后就存在的。如果你在邮件列表上问( https://storm.apache.org/getting-help.html ,作者仍然在身边,可能知道为什么会在那里。

    如果你愿意,你可以在 https://issues.apache.org/jira/secure/Dashboard.jspa 解决此问题:)