风暴螺栓acking但鲸鱼喷水失败

时间:2015-04-13 18:41:27

标签: java apache-storm

我遇到了Apache Storm的奇怪问题。我有一个KafkaSpout连接到Kafka集群,里面有10条消息。

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

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

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

有什么想法吗?

2 个答案:

答案 0 :(得分:3)

事实证明,当他们完成处理元组时,下游的几个螺栓没有执行任务。这导致spout元组失败并最终再次发送元组,导致连续循环。

答案 1 :(得分:2)

当喷口读取消息并将其传递给螺栓时,消息应完成TOPOLOGY_MESSAGE_TIMEOUT_SECS / "topology.message.timeout.secs"

内的完整处理(所有相关螺栓)

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

如果您在日志SPOUT Failing中看到,可能是:

  1. 其中一个螺栓未通过消息
  2. 你的一个螺栓没有确认
  3. 螺栓未在topology.message.timeout.secs内完成处理消息,因此未按时发送确认。
  4. #3示例:如果您有5个螺栓,由于数据库连接问题,每个螺栓大约需要10秒,因此在#3螺栓之后,您将通过默认的30秒风暴超时,并且无法处理该消息。然后,喷口将再次重播此消息。

    因此,要么提高超时配置,要么更快失败(例如:更短的数据库连接超时),或者有时降低TOPOLOGY_MAX_SPOUT_PENDING也可以帮助以防大量消息等待处理,以及之前的消息需要很长时间。

    有关详情,请参阅apache - Guaranteeing Message Processing