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

Apache storm 使用KafkaSpout时,两次确认一个元组会导致超时?,apache-storm,Apache Storm,我的拓扑使用默认的KafkaSpout实现。在一些非常受控的测试中,我注意到喷口在元组失败,即使我的螺栓没有任何元组失败,而且我确信所有消息都在配置的超时内得到了充分处理 我还注意到(由于我的螺栓的一些子分类结构),我的螺栓之一是两次确认元组。当我解决这个问题时,喷口停止了元组的失败 很抱歉,这不仅仅是一个理智的检查而不是一个问题,但这有意义吗?我不明白为什么两次确认同一个元组实例会导致喷口注册超时,但在我的情况下似乎是这样的?这是有道理的 Storm以一种奇怪但有效的方式跟踪由喷口发出的元组的

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

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

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

这是有道理的

Storm以一种奇怪但有效的方式跟踪由喷口发出的元组的所有ACK(直接和间接)。我不确定确切的算法,但它需要重复地将最初喷口发出的元组ID与后续锚定元组ID的ID异或。这些后续ID中的每一个都被异或两次——一次是在锚定元组时,一次是在确认元组时。当XOR的结果全部为零时,则假设每个锚点都与ack匹配,并且原始喷口发射的元组已完成处理


通过多次确认某些元组,您使一些喷口发出的元组似乎没有完全完成(因为奇数个XOR永远不会为零)

砰!我们遇到了完全相同的问题!我认为我们可以“确认”不止一次。我们遇到了一个边缘案例,在10分钟的时间里,我们可能得到一两个。我想不出来。当我们修复额外的ack时,一切都消失了。谢谢让我问个问题。我们在一个边缘案件中发生了这件事,但最终他们都被清除了。storm如何知道元组何时完成?由于拓扑本身发送发射,它是否会等待一段时间后才会说:“我有一段时间没有听到任何消息了,必须这样做吗?”。例如,我有2个螺栓,只有1/2被发射到第二个螺栓。对于一个只进入第一个螺栓并正确确认的元组,storm何时得出元组完成的结论?这是一个时间问题。一旦ACK“关闭”了所有锚点,则假定处理已完成。在您的情况下,您希望确保仅在锚定出站元组之后确认入站元组。这样,如果有更多的处理要做,您可以确保始终有一个未确认的锚。那么您是说您必须在确认之前发出锚吗?