ApacheStorm, кто вызывает Spout.nextTuple()?
Мой вопрос: кто конкретно звонит nextTuple()
метод в топологии Spout of Apache Storm?
В некоторых источниках написано, что это делает сам Шторм, но это не является конкретным и неясным.
При каких условиях Storm вызывает этот метод? По расписанию?
Есть ли способ повлиять на этот процесс, скажем, замедлить его?
1 ответ
Он называется здесь https://github.com/apache/storm/blob/master/storm-client/src/jvm/org/apache/storm/executor/spout/SpoutExecutor.java#L158 (Storm 2.0, для 1. х это какой-то код clojure, который делает что-то подобное).
Да, Storm вызывает nextTuple. Точнее он вызывается потоком spout executor. Метод, который я связал, вызывается в цикле. Если достигнута topology.max.spout.pending, Storm пропускает вызов nextTuple.
Да, вы можете уменьшить частоту вызова nextTuple, когда nextTuple ничего не излучает, чтобы избежать потери процессора, если нечего излучать. Обратите внимание на строку здесь 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.