使用 KafkaSpout,确认一个元组两次会导致超时?

Using KafkaSpout, ack-ing a tuple twice causes timeouts?

我的拓扑使用默认的 KafkaSpout 实现。在一些非常受控的测试中,我注意到 spout 失败了元组,即使 none 的螺栓失败了任何元组,而且我确信所有消息都在我配置的超时内得到了很好的处理。

我还注意到(由于我的螺栓有一些子类结构),我的一个螺栓两次确认元组。当我解决这个问题时,喷口停止失败的元组。

抱歉,这不仅仅是一个健全性检查,而不是一个问题,但这有意义吗?我不明白为什么两次确认同一个元组实例会导致 Spout 注册超时,但在我的情况下似乎是这样?

确实有道理。

Storm 以奇怪但有效的方式跟踪 spout 发出的元组的所有确认(直接和间接)。我不确定确切的算法,但它需要反复对最初由 spout 发出的元组 ID 与后续锚定元组 ID 的 ID 进行异或运算。每个后续 ID 都经过两次异或运算——一次是在元组被锚定时,一次是在元组被确认时。当 XOR 的结果全为零时,则假设每个锚点都与一个 ack 匹配并且原始 spout-emitted 元组已完成处理。

通过不止一次确认某些元组,您使一些 spout 发出的元组看起来似乎没有完全完成(因为奇数个 XOR 永远不会归零)。