Exception 如何在异常情况下使风暴停止?

Exception 如何在异常情况下使风暴停止?,exception,apache-storm,fail-fast,Exception,Apache Storm,Fail Fast,默认情况下,当喷口或螺栓遇到异常时,将重新启动喷口或螺栓并重试。是否有任何配置选项使其停止拓扑(可能在N次重复尝试后)?(例如,Hadoop在放弃之前尝试了4次。) 我的Storm拓扑运行了77天,其中一个螺栓在每个元组上引发了一个异常。在这种情况下,我宁愿它失败,以便我注意到有什么地方出了问题。没有停止拓扑的选项(当前)。老实说,杀死整个拓扑只是因为一个例外是暴力IMHO 在您的场景中,这些异常应该在应用程序层中处理 是否有任何配置选项使其停止拓扑(可能在N次重复尝试后) 目前还没有现成的解决

默认情况下,当喷口或螺栓遇到异常时,将重新启动喷口或螺栓并重试。是否有任何配置选项使其停止拓扑(可能在N次重复尝试后)?(例如,Hadoop在放弃之前尝试了4次。)


我的Storm拓扑运行了77天,其中一个螺栓在每个元组上引发了一个异常。在这种情况下,我宁愿它失败,以便我注意到有什么地方出了问题。

没有停止拓扑的选项(当前)。老实说,杀死整个拓扑只是因为一个例外是暴力IMHO

在您的场景中,这些异常应该在应用程序层中处理

是否有任何配置选项使其停止拓扑(可能在N次重复尝试后)

目前还没有现成的解决方案,但您可以做到这一点,并在喷口中跟踪重试的元组。如果满足阈值,则记录元组或将其发送到消息传递队列

我的Storm拓扑运行了77天,其中一个螺栓在每个元组上引发了一个异常

那么也许你的博尔特的代码中有个bug


一种策略是将失败的元组发送到消息队列或事件总线(如HornetQ、Apache Kafka、Redis),并拥有一个侦听器,以便立即通知您有毒的元组。

据我所知,Storm不会重试元组(这本身会导致异常)。默认情况下,它将继续处理下一个元组。相同的元组不会被重新尝试,除非Spout实现了一个fail方法。

这听起来有点奇怪,因为如果出现异常,我们的拓扑确实会停止,除非我们将它们包装在FailedException中(在这种情况下,它将重试)。我没有在我的螺栓代码中明确包装它们,但听起来我们的两个Storm装置在系统范围内的设置有所不同。我的系统管理员不知道,但我希望有人知道。你不想停止拓扑,拓扑是用来实时处理事件的。如果一个元组产生一个致命错误,它应该被丢弃并可能被记录在某个地方,但是不应该阻止拓扑来处理剩余的元组;这就是我想知道的。是否真的有必要为要运行的每个小分析设置消息队列?你让它听起来像是一部重要的作品——难道没有人对《暴风雨》做过快速的一次性制作吗?在临时作业中,如果它失败,它应该会死掉,这是显而易见的。@JimPivarski调用System.exit()在这种情况下可能会有所帮助,假设您没有在监督下运行Storm(自动重新启动)。