我们有一个相当简单的风暴拓扑,只有一个头痛。
我们的一个螺栓可以找到它正在处理的数据是有效的,并且每个东西都正常地在流中继续,或者它可以发现它无效但可以修复。在这种情况下,我们需要发送它进行一些额外的处理。
我们尝试使用单独的bolt和stream将此步骤作为拓扑的一部分。
declarer.declareStream(NORMAL_STREAM, getStreamFields());
declarer.declareStream(ERROR_STREAM, getErrorStreamFields());
在执行方法结束时跟随以下内容。
if(errorOutput != null) {
collector.emit(ERROR_STREAM, input, errorOutput);
}
else {
collector.emit(NORMAL_STREAM, input, output);
}
collector.ack(input);
这确实有效,但是它会导致所有不在此错误路径下的元组失败并且无休止地重新发送。
我认为这是因为错误螺栓无法发送它没有收到的消息,但是在将ack发送回spout之前,acker会等待拓扑中的所有螺栓确认。至少取出错误处理螺栓会导致所有东西正确地回到喷口。
实现这样的事情的最佳方式是什么?
答案 0 :(得分:3)
错误螺栓可能比您怀疑的要慢,导致error_stream上的备份,这反过来会导致备份到您的第一个螺栓,最终导致元组开始超时。当一个元组超时时,它会被喷口重新发送。
尝试: