#java #groovy #apache-storm
#java #groovy #apache-storm
Вопрос:
Все болты, которые мы используем, основаны на BaseBasicBolt
, что должно гарантировать, что входной кортеж для execute
получает подтверждение по умолчанию. После прочтения документации оказалось, что мы делали это неправильно, поскольку мы не сбивали кортежи при обнаружении исключения. Итак, допустим, ваша топология выглядит так, где все болты BaseBasicBolts
:
Spout -> Bolt A -> Bolt B -> Bolt C
Если происходит ошибка Bolt B
, мы теперь вызываем это:
basicOutputCollector.getOutputter().fail(inputTuple)
Достаточно ли этого, чтобы гарантировать, что сбой at Bolt B
приведет к тому, что кортеж, который потерпел неудачу в B, будет удален из топологии?
Ответ №1:
Я не думаю, что правильное слово для этого — «пнул». Если вы закрепите этот кортеж по всей цепочке
Spout -> Bolt A -> Bolt B
тогда fail()
метод в Bolt B будет иметь эффект вызова метода fail()
в Spout. Метод Spout fail()
получит идентификатор корневого кортежа кортежа, который вы только что сбили. Корневой кортеж — это кортеж, который первым вышел из потока и вызвал цепочку новых кортежей, которая включает в себя неудачный кортеж в Bolt B, например
root tuple -> tuple A -> tuple B
Вам решать, что с этим делать, или, может быть, вообще ничего. Но проблема в том, что ваш неудачный кортеж может оставить нежелательный след в вашей цепочке. Например, кортеж A может вызвать обновление счетчика в Bolt A, но после сбоя кортежа B в Bolt B это обновление теперь может быть недействительным.
Итак, я пытаюсь сказать, что в этом случае кортеж не может быть удален из топологии, потому что в некотором смысле он уже прошел через него (частично).