Apache storm Apache Storm元组超时问题

Apache storm Apache Storm元组超时问题,apache-storm,Apache Storm,我试图了解在元组处理超时的情况下拓扑的状态(不是在Trident模式下) 让我们假设在某个螺栓中处理元组的过程中达到了超时阈值。在这种情况下,喷口再次发出初始元组(与我理解的消息id相同)。现在让我们假设Bolt完成了对元组的处理,并发射和确认元组。 在这种情况下: 即使喷口发出一个新的初始元组,失败的元组仍将继续由拓扑处理吗 如果是这样的话,acker的元组DAG会是什么样子(因为有一个新的DAG是用相同的初始元组id创建的)上一个原始DAG会怎么样 当应答器接收到应答并使用锚发出时会发生什么

我试图了解在元组处理超时的情况下拓扑的状态(不是在Trident模式下) 让我们假设在某个螺栓中处理元组的过程中达到了超时阈值。在这种情况下,喷口再次发出初始元组(与我理解的消息id相同)。现在让我们假设Bolt完成了对元组的处理,并发射和确认元组。 在这种情况下:

  • 即使喷口发出一个新的初始元组,失败的元组仍将继续由拓扑处理吗
  • 如果是这样的话,acker的元组DAG会是什么样子(因为有一个新的DAG是用相同的初始元组id创建的)上一个原始DAG会怎么样
  • 当应答器接收到应答并使用锚发出时会发生什么 上一个DAG的ID

  • 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