我的问题是:谁在Apache Storm拓扑的Spout中专门调用nextTuple()
方法?
在某些消息来源中,有人写道,Storm自己就是这样做的,但这并不具体而且不清楚。
Storm会在什么条件下导致这种方法?计划?
有没有办法影响这个过程,比如减速呢?
答案 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相同的线程中。