风暴螺栓 acking 但 spout 失败

Storm Bolts acking but spout is failing

我在使用 Apache Storm 时遇到了一个奇怪的问题。我有一个连接到 Kafka 集群的 KafkaSpout,其中有 10 条消息。

Bolts 接收每条消息并正确处理它们,因为在 Storm UI 中它们被列为 'acked'。但是,风暴 UI 下列出的 Spout 表示所有元组都失败了。

我相信这会导致喷口再次重新发出所有消息...所以我看到 Storm Bolt 打印出消息 1-10,然后一遍又一遍地以相同的顺序打印出来.

我正在适当地调用 .ack().fail() 方法,我只是不知道为什么 Spout 会将它们列为失败。

有什么想法吗?

事实证明,下游的几个螺栓在完成元组处理后没有确认。这导致 spout 元组失败并最终再次发送元组,导致连续循环。

当 spout 读取消息并将其传递给 bolts 时,消息应在 TOPOLOGY_MESSAGE_TIMEOUT_SECS / "topology.message.timeout.secs"

内完成完整处理(所有相关的 bolts)

所有相关的 bolts 都必须确认,然后 acker 向 spout 指示消息已被处理(如果是 kafka spout,spout 将增加偏移量)。

如果您在日志中看到 SPOUT Failing,也许:

  1. 您的一个螺栓未收到消息
  2. 你的一个螺栓没有确认
  3. bolts 没有在 topology.message.timeout.secs 内完成对消息的处理,所以没有及时发送 ack。

示例 #3:如果您有 5 个螺栓,由于数据库连接问题,每个螺栓大约需要 10 秒,因此在螺栓 #3 之后,您将通过默认的 30 秒风暴超时,并且无法处理消息。然后 spout 将再次重播此消息。

因此,要么提高超时配置,要么失败更快(例如:更短的数据库连接超时),或者有时降低 TOPOLOGY_MAX_SPOUT_PENDING 也可以在大量消息等待处理的情况下提供帮助,并且较早的消息需要很长时间。

有关更多信息,请参阅 apache - Guaranteeing Message Processing