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

时间:2014-02-27 10:23:53

标签: java apache-storm

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

2 个答案:

答案 0 :(得分:7)

典型的spout实现将仅重放FAILED元组。正如here所解释的那样,从喷口发出的元组可以触发成千上万的其他元组,而风暴会根据它创建一个元组树。现在,当处理树中的每条消息时,元组称为“完全处理”。发射喷口时添加message id,用于识别后期阶段的元组。这称为锚定,可以通过以下方式完成

    _collector.emit(new Values("field1", "field2", 3) , msgId);

现在从上面发布的链接中可以看出

  

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

如果元组超时Storm将在spout上调用FAIL方法,同样如果成功,将调用ACK方法。

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

答案 1 :(得分:3)

失败的元组的这种重放应仅代表整个元组流量的一小部分,因此这种简单重放的效率 - 起始策略通常不是问题。

支持“从错误重放步骤”会带来很多复杂性,因为错误的位置有时难以确定,并且如果群集节点出现错误,则需要支持“重播 - 其他地方”发生的事情目前(或永久)下降。它还会减慢整个流量的执行速度,这可能无法通过错误处理获得的效率来补偿(再次假设很少被触发)。

如果您认为这种重启起始策略会对您的拓扑产生负面影响,请尝试将其分解为几个较小的拓扑,这些较小的分布由像Kafka这样的持久排队系统分隔。