调用Spout.nextTuple()的ApacheStorm?

时间:2018-02-10 09:45:29

标签: apache-storm apache-storm-topology

我的问题是:谁在Apache Storm拓扑的Spout中专门调用nextTuple()方法

在某些消息来源中,有人写道,Storm自己就是这样做的,但这并不具体而且不清楚。

Storm会在什么条件下导致这种方法?计划?

有没有办法影响这个过程,比如减速呢?

1 个答案:

答案 0 :(得分:1)

这里称为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 ms。您可以通过配置topology.sleep.spout.wait.strategy.time.ms来更长时间地休眠。不要将等待设置得太高,因为处理ack /失败发生在与nextTuple相同的线程中。