Apache storm Apache Storm元组超时问题
我试图了解在元组处理超时的情况下拓扑的状态(不是在Trident模式下) 让我们假设在某个螺栓中处理元组的过程中达到了超时阈值。在这种情况下,喷口再次发出初始元组(与我理解的消息id相同)。现在让我们假设Bolt完成了对元组的处理,并发射和确认元组。 在这种情况下:Apache storm Apache Storm元组超时问题,apache-storm,Apache Storm,我试图了解在元组处理超时的情况下拓扑的状态(不是在Trident模式下) 让我们假设在某个螺栓中处理元组的过程中达到了超时阈值。在这种情况下,喷口再次发出初始元组(与我理解的消息id相同)。现在让我们假设Bolt完成了对元组的处理,并发射和确认元组。 在这种情况下: 即使喷口发出一个新的初始元组,失败的元组仍将继续由拓扑处理吗 如果是这样的话,acker的元组DAG会是什么样子(因为有一个新的DAG是用相同的初始元组id创建的)上一个原始DAG会怎么样 当应答器接收到应答并使用锚发出时会发生什么
1:是的,失败的元组将继续。这样做的原因是,试图阻止失败的元组继续运行代价太高,因为喷口需要告诉所有螺栓有关失败的信息 他说:我想这里有一个小误会。当喷口发出元组时,消息id不是Storm用来在内部跟踪该元组DAG/树的id。相反,喷口执行器生成一个随机id(称之为
rootId
),并在本地存储rootId->messageId
的映射。消息id永远不会离开喷口执行器,也不会传播到螺栓
当喷口执行器向前发送元组时,它包括rootId
。acker和bolt使用rootId
来标识元组树
最后,当树被完全确认,或者元组失败时,喷口执行器被告知相关的rootId
成功或失败,并在其本地映射中查找原始messageId
由于使用相同的messageId
的新emit将获得新的rootId
,因此失败元组和新元组之间没有关系。他们被认为因暴风雨而完全分离
为了清晰起见,我将上面的内容简化了一点,为了处理向多个螺栓发射的喷口,还涉及到另一组随机ID(anchorId
)。从概念上讲,你可以考虑你所处的情况
spout -> bolt1
-> bolt2
被当作拓扑被处理一样
spout -> splitterBolt -> bolt1
-> bolt2
3:假设您的元组已超时。喷口执行器已被告知rootId
失败。当这种情况发生时,喷动执行器调用spout.fail(msgId)
,然后删除rootId->messageId
映射中的映射
当应答器收到应答时,如果树已完全应答,它可能会将应答发送到喷口。当喷口接收到ack时,它没有与存储的rootId
匹配的内容,因此ack被忽略
如果您有兴趣查看代码,请访问。rootId->messageId
映射称为pending