在元组处理超时的情况下(不是在三叉戟模式下),我试图了解拓扑的状态 假设在处理某些螺栓中的元组期间,已达到超时阈值。在这种情况下,喷口再次发出初始元组(具有我所理解的相同消息ID)。现在,假设Bolt完成了对元组的处理,并发出并固定了元组。 在这种情况下:
答案 0 :(得分:0)
1:是的,失败的元组继续。这样做的原因是,试图阻止失败的元组继续运行将太昂贵,因为喷口需要将所有螺栓告知失败。
2:我认为这里存在一些误解。当喷嘴发出元组时,消息ID并不是Storm用来在内部跟踪该元组DAG /树的消息。相反,喷口执行程序会生成一个随机ID(称为rootId
),并在本地存储rootId -> messageId
的映射。消息ID永远不会离开喷口执行器,也不会传播到螺栓上。
当喷嘴执行器向后发送元组时,它包含rootId
。 rootId
是acker和bolts用来标识元组树的工具。
最后,当树被完全确认或一个元组失败时,将通知喷口执行器相关的rootId
成功或失败,并在其本地映射中查找原始的messageId
。 / p>
由于具有相同messageId
的新发射得到新的rootId
,所以失败元组和新元组之间没有关系。风暴认为它们是完全分开的。
为了清楚起见,我对上述内容进行了一些简化,为了处理喷向多个螺栓的喷口,还涉及另一组随机ID(anchorId
)。从概念上讲,您可以考虑遇到的情况
spout -> bolt1
-> bolt2
就像拓扑一样被处理
spout -> splitterBolt -> bolt1
-> bolt2
3:假设您的元组已超时。通知喷口执行器rootId
失败。发生这种情况时,喷口执行器将调用spout.fail(msgId)
,然后删除rootId -> messageId
映射中的映射。
当树被完全确认时,确认者收到确认后,可能会将确认发送到出水口。当喷口收到确认消息时,它没有存储与rootId
匹配的内容,因此忽略了确认消息。
如果您有兴趣看一下代码,可以在https://github.com/apache/storm/blob/b48e10559b65e834884d59887b30fc86d2988c20/storm-client/src/jvm/org/apache/storm/executor/spout/SpoutOutputCollectorImpl.java#L109上找到它。 rootId -> messageId
映射称为pending
。