Просто хочу убедиться, что я получил, как Ack-ing работает в Storm. У меня есть 1 носик и 2 болта вместе. Spout испускает кортеж в Bolt1, который, в свою очередь, выдает кортеж в Bolt 2. Я хочу, чтобы Bolt 2 получил исходный кортеж, отправленный из Spout, и я не уверен, как это сделать.
Чтобы гарантировать отказоустойчивость (т.е.: кортежи возмущены), я хочу, чтобы в болт 2 кортеж, испускаемый Spout, на случай, если он не сработает где-то в процессе, чтобы он мог быть возмущен.
Рассмотрим следующий пример:
Spout:
_collector.emit(new Values(queue.dequeue())
Болт1:
def execute(tuple: Tuple) {
_collector.emit(tuple, new Values("stuff"))
}
В этот момент кортеж - это кортеж, посланный носиком. Я могу проверить это здесь без проблем. Теперь добавьте еще один болт, который прослушивается на кортежах, испускаемых Bolt1.
Болт2:
def execute(tuple2: Tuple) {
_collector.emit(tuple2, new Values("foo"))
}
В этот момент кортеж в tuple2 является кортежем, посланным из Bolt1 (тем, у которого в нем есть строка "stuff" ).
Поэтому, если я отправлю ack в Bolt2, это будет привязывать кортеж от Bolt1, а не тот, который отправлен из Spout. Верный?
Как я могу получить кортеж, который был отправлен из носика? Должен ли я вернуть исходный носик на все остальные носики, чтобы я мог получить его в последнем Болте и сказать?
Я читал учебники Nathan, и у меня создалось впечатление, что я могу получить кортеж, полученный в Bolt1 (от Spout) прямо после того, как исправив tuple2. Это свяжет недавно испущенный кортеж2 с исходным кортежем, посланным Spout, поэтому, когда Bolt2 acks tuple 2, он фактически берет исходный кортеж из Spout. Это правда?
Дайте мне знать, если я пропущу что-то в своем объяснении.
Большое спасибо!