Apache storm Storm拓扑中的可选流

Apache storm Storm拓扑中的可选流,apache-storm,Apache Storm,我们有一个相当简单的风暴拓扑结构,有一个头痛 我们的一个螺栓可以发现它正在处理的数据是有效的,并且每件事情都像正常的一样进行,或者它可以发现它是无效的,但可以修复。在这种情况下,我们需要发送一些额外的处理 我们尝试使用单独的螺栓和流将此步骤作为拓扑的一部分 declarer.declareStream(NORMAL_STREAM, getStreamFields()); declarer.declareStream(ERROR_STREAM, getErrorStreamFields());

我们有一个相当简单的风暴拓扑结构,有一个头痛

我们的一个螺栓可以发现它正在处理的数据是有效的,并且每件事情都像正常的一样进行,或者它可以发现它是无效的,但可以修复。在这种情况下,我们需要发送一些额外的处理

我们尝试使用单独的螺栓和流将此步骤作为拓扑的一部分

declarer.declareStream(NORMAL_STREAM, getStreamFields());
declarer.declareStream(ERROR_STREAM, getErrorStreamFields());
然后在execute方法的末尾执行以下操作

if(errorOutput != null) {
    collector.emit(ERROR_STREAM, input, errorOutput);
}
else {
    collector.emit(NORMAL_STREAM, input, output);
}

collector.ack(input);
这是可行的,但是它有一个破坏性的效果,导致所有没有沿着这个错误路径运行的元组失败,并被喷口无休止地重新发送

我认为这是因为错误螺栓不能为它没有接收到的消息发送ack,但是acker会等待拓扑中的所有螺栓确认,然后再将ack发送回喷口。至少,取出错误处理螺栓会使所有东西都正确地回到喷口


实现这种效果的最佳方法是什么?

可能错误螺栓比您想象的要慢,导致错误\u流上的备份,这反过来又导致备份到第一个螺栓中,最后导致元组开始超时。当一个元组超时时,它会被喷口怨恨

尝试:

  • 增加超时配置(topology.message.timeout.secs)
  • 限制喷口(topology.max.spout.pending)和/或
  • 增加螺栓的平行度计数

  • 在这种情况下,导致我的问题,错误螺栓是没有得到发送任何东西。实际上,它没有工作可做。当所有数据都正确时,不会在错误螺栓上调用execute方法。然而,喷口显示了很多失败的元组,但另一个螺栓速度慢得多,导致超时。谢谢你指出了正确的方向。