【发布时间】:2018-02-10 09:45:28
【问题描述】:
我的问题是:谁在 Apache Storm 拓扑的 Spout 中专门调用了nextTuple() 方法?
在某些消息来源中,Storm 本人会这样做,但这并不具体且不清楚。
Storm在什么情况下会导致这个方法?预定?
有没有什么方法可以影响这个过程,比如说放慢它?
【问题讨论】:
标签: apache-storm apache-storm-topology
我的问题是:谁在 Apache Storm 拓扑的 Spout 中专门调用了nextTuple() 方法?
在某些消息来源中,Storm 本人会这样做,但这并不具体且不清楚。
Storm在什么情况下会导致这个方法?预定?
有没有什么方法可以影响这个过程,比如说放慢它?
【问题讨论】:
标签: apache-storm apache-storm-topology
这里称为https://github.com/apache/storm/blob/master/storm-client/src/jvm/org/apache/storm/executor/spout/SpoutExecutor.java#L158(Storm 2.0,对于 1.x,它是一些类似的 clojure 代码)。
是的,Storm 调用 nextTuple。更准确地说,它是由 spout 执行器线程调用的。我链接的方法在循环中调用。如果已经达到 topology.max.spout.pending,Storm 会跳过调用 nextTuple。
是的,当 nextTuple 没有发出任何东西时,您可以减慢调用 nextTuple 的频率,以避免在没有发出任何东西时浪费 CPU。请注意此处https://github.com/apache/storm/blob/master/storm-client/src/jvm/org/apache/storm/executor/spout/SpoutExecutor.java#L176 调用等待策略的行。等待策略是使用拓扑配置中的 topology.spout.wait.strategy 参数设置的。
如果没有要发出的内容,默认等待策略会休眠 1 毫秒。您可以通过配置 topology.sleep.spout.wait.strategy.time.ms 来延长睡眠时间。不要将等待设置得太高,因为处理确认/失败发生在与 nextTuple 相同的线程中。
【讨论】: