Storm螺栓紧固,但喷口失效

vuktfyat  于 2023-01-03  发布在  Apache
关注(0)|答案(2)|浏览(222)

我在Apache Storm上遇到了一个奇怪的问题。我有一个KafkaSpout连接到一个Kafka集群,里面有10条消息。
Bolt接收每个消息并正确处理它们,因为在Storm UI中它们被列为"已确认"。但是,Storm UI下列出的Spout表示所有元组均失败。
我相信这会导致喷口再次重新发射所有的消息...所以我看到 Storm 螺栓打印出消息1 - 10,然后打印出来,在同一顺序一遍又一遍。
我正确地调用了.ack().fail()方法,我只是不知道为什么Spout会将它们列为失败。
有什么想法吗?

7rfyedvj

7rfyedvj1#

结果发现,下游的几个螺栓在处理完一个元组时没有堆叠。这导致喷嘴元组失败,最终再次发送元组,导致连续循环。

ltskdhd1

ltskdhd12#

当喷口读取消息并将其传递给螺栓时,消息应在TOPOLOGY_MESSAGE_TIMEOUT_SECS / "topology.message.timeout.secs"内完成全部处理(所有相关螺栓
所有相关螺栓必须确认,然后阿克向喷口指示消息已处理(如果是Kafka喷口,喷口将增加偏移量)。
如果您在日志中看到SPOUT Failing,则可能:
1.你的一个螺栓没能传递信息
1.你的一个螺栓没有拧紧
1.螺栓未在topology.message.timeout.secs内完成消息处理,因此未按时发送确认。

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

因此,要么提高超时配置,要么加快失败速度(例如:较短的DB连接超时)或者有时降低TOPOLOGY_MAX_SPOUT_PENDING也可以在大量消息等待处理并且较早的消息花费较长时间的情况下有所帮助。
更多信息请参见apache - Guaranteeing Message Processing

相关问题