为什么所有的 bolt 都 acked 但 spout 失败了?

Why all bolt acked but the spout fail?

我正在使用 JmsSpout 和 BaseBasicBolt。 所有的螺栓都被确认,但是很多(大约一半)的喷口失败了。 可能的原因是什么? 或者我如何记录消息失败的原因? JmsSpout 只打印失败的消息,没有错误信息。

如果您没有在螺栓中主动 fail() 元组,元组失败的唯一原因是 超时 。 Storm 中默认的超时时间是 30 秒(你可以通过 TOPOLOGY_MESSAGE_TIMEOUT_SECS 配置)。如果元组被发出,Storm 等待超时持续时间以接收确认。如果在此期间未收到确认,则 Strom 使元组失败。

增加超时可以解决问题(您应该将超时设置为比预期处理延迟更大的值)。

如果您的预期处理延迟已经低于超时值,则表明您的拓扑存在瓶颈。因此,一个(或多个)运算符无法足够快地处理传入的元组。因此,传入的元组在输入队列中得到缓冲,随着队列随时间增长而增加延迟。您需要增加那些瓶颈运算符的并行度才能解决问题。