暴风雨和失败

时间:2014-06-26 16:56:51

标签: java groovy apache-storm

我们使用的螺栓都基于BaseBasicBolt,这应该确保默认情况下execute的输入元组被激活。在阅读完文档之后,看起来我们没有做到这一点,因为我们没有在捕获到异常时失败。所以,让我们说你的拓扑看起来像这样,所有的螺栓都是BaseBasicBolts

Spout -> Bolt A -> Bolt B -> Bolt C

如果Bolt B发生错误,我们现在称之为:

basicOutputCollector.getOutputter().fail(inputTuple)

这是否足以确保Bolt B处的失败会导致B处失败的元组被踢出拓扑?

1 个答案:

答案 0 :(得分:1)

我不认为正确的词是"踢了#34;。如果你把那个元组锚定在整个链中

Spout -> Bolt A -> Bolt B

然后Bolt B中的fail()方法将调用Spout中的方法fail()。 Spout fail()方法将接收您刚刚失败的元组的根元组的ID。根元组是首先从spout中出来并导致一系列新元组的元组,其中包括Bolt B中失败的元组,例如

root tuple -> tuple A -> tuple B

由你自己做点什么或者根本不做任何事。但问题是你失败的元组可能会在你的链条中留下不受欢迎的痕迹。例如,元组A可以导致更新到Bolt A中的计数器,但是在Bolt B中的B组B失败后,更新现在可能无效。

所以我想说的是,在这种情况下,不能从拓扑中踢出元组,因为在某种意义上它已经(部分地)通过了它。