为什么storm会从spout重放元组而不是在崩溃组件上重试?

use*_*244 4 java apache-storm

我正在使用风暴来处理在线问题,但我不明白为什么风暴会从鲸鱼喷水中重放元组.重试崩溃可能比从根重播更有效,对吧?有人可以帮帮我吗?谢谢

use*_*864 7

典型的spout实现将仅重放FAILED元组.如此处所解释的,从喷口发出的元组可以触发数千个其他元组,并且风暴基于此创建了一个元组树.现在,当处理树中的每条消息时,元组称为"完全处理".发射喷口添加一个message id用于识别后期阶段的元组.这称为锚定,可以通过以下方式完成

    _collector.emit(new Values("field1", "field2", 3) , msgId);
Run Code Online (Sandbox Code Playgroud)

现在从上面发布的链接说

如果在指定的超时内无法完全处理其消息树,则认为该元组失败.可以使用Config.TOPOLOGY_MESSAGE_TIMEOUT_SECS配置在特定于拓扑的基础上配置此超时,默认为30秒.

如果元组超时Storm将FAIL在spout上调用方法,同样在成功的情况下将调用该方法ACK.

所以在这一点上风暴将让你知道哪些是它未能处理的元组但是如果你查看源代码,你会发现该fail方法的实现在BaseRichSpout类中是空的,所以你需要覆盖BaseRichSpout的失败方法,以便在您的应用程序中具有重播功能.