Apache Storm元组超时问题

时间:2019-04-17 11:51:00

标签: apache-storm

在元组处理超时的情况下(不是在三叉戟模式下),我试图了解拓扑的状态 假设在处理某些螺栓中的元组期间,已达到超时阈值。在这种情况下,喷口再次发出初始元组(具有我所理解的相同消息ID)。现在,假设Bolt完成了对元组的处理,并发出并固定了元组。 在这种情况下:

  1. 即使管嘴发出了一个新的初始元组,失败的元组是否仍将继续由拓扑处理?
  2. 如果是这样,那么元组的acker的DAG会是什么样子(由于创建了一个具有相同初始元组id的新DAG),以前的原始DAG会发生什么?
  3. 当acker收到ack并与锚点一起发射时会发生什么 前一个DAG的ID?

1 个答案:

答案 0 :(得分:0)

1:是的,失败的元组继续。这样做的原因是,试图阻止失败的元组继续运行将太昂贵,因为喷口需要将所有螺栓告知失败。

2:我认为这里存在一些误解。当喷嘴发出元组时,消息ID并不是Storm用来在内部跟踪该元组DAG /树的消息。相反,喷口执行程序会生成一个随机ID(称为rootId),并在本地存储rootId -> messageId的映射。消息ID永远不会离开喷口执行器,也不会传播到螺栓上。

当喷嘴执行器向后发​​送元组时,它包含rootIdrootId是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