当前位置: 首页 > 知识库问答 >
问题:

Apache Storm元组超时问题

鲜于玮
2023-03-14

我试图理解在元组处理超时的情况下拓扑的状态(不是在三叉戟模式下),让我们假设在某个bolt中处理元组的过程中达到了超时阈值。在这种情况下,spout再次发出初始元组(我所理解的消息id相同)。现在让我们假设Bolt完成对元组的处理,并发出和acks该元组。在这种情况下:

  1. 即使spout发出了一个新的初始元组,失败的元组仍会继续由拓扑处理吗?
  2. 如果是这样的话,这个用户的元组DAG会是什么样子(因为有一个新的DAG是用相同的初始元组id创建的),那么之前的原始DAG会发生什么呢?
  3. 当攻击者接收到ack并发射前一个DAG的锚点ID时,会发生什么?

共有1个答案

商振
2023-03-14

1:是的,失败的元组继续。这样做的原因是,试图阻止失败的元组继续运行的代价太大,因为喷口需要告诉所有螺栓关于失败的信息。

2:我想这里有一个小小的误会。当spout发出元组时,消息id不是Storm用来在内部跟踪该元组dag/tree的。相反,spout执行器生成一个随机id(称为rootid),并在本地存储rootid->messageid的映射。消息id不会离开spout执行器,也不会传播到bolt。

当spout执行器继续发送元组时,它包括rootidrootid是acker和bolts用来标识元组树的东西。

为了清楚起见,我将上面的内容简化了一些,为了处理向多个螺栓发射的喷口,还涉及另一组随机ID(anchorid)。从概念上讲,你可以认为

spout -> bolt1
      -> bolt2

就像处理拓扑一样

spout -> splitterBolt -> bolt1
                      -> bolt2

3:假设您的元组超时了。spout执行程序被告知rootid已失败。发生这种情况时,spout执行程序调用spout.fail(msgId),然后删除rootid->messageid映射中的映射。

 类似资料:
  • 问题内容: 我在gunicorn + nginx上运行django。我在上传文件时遇到了问题。实际上,上传工作正常,但gunicorn超时,因此在nginx中造成了这种情况: 如果刷新页面,可以看到所有照片都已上传。问题在于,这会导致超时,从而给人留下无法上传的印象。 这是我的gunicorn conf: 我尝试更改超时,但是没有用。 问题答案: 你可以尝试通过添加以下内容来升级Nginx中的代理

  • 我在两个线程中使用一个SocketChannel,一个线程用于发送数据,另一个线程用于接收数据。 线程1:使用上述socketchannel写入数据 线程2:使用相同的socketchannel读取数据 我没有在socketchannel中使用任何选择器,因为我需要写和读是异步的(使用两个不同的线程) 问题:当连接丢失时,socketchannel。write()和socketchannel。re

  • osx和Win的文档中写道:“对于TCP套接字,返回值0表示对等方关闭了连接的一半。” 2)阻塞套接字的问题:在阻塞套接字上,我希望SO_RCVTIMEO和SO_SNDTIMEO有一个默认值,比如30秒(用getsockopt检查)。但是为什么它们被设置为0?

  • 问题内容: 我有一个Web应用程序,它充当运行非常长任务的非现场服务器的接口。用户输入信息并点击提交,然后chrome等待响应,并在接收到新页面时加载它。但是,根据网络和用户的输入,任务可能会花费相当长的时间,并且在返回数据之前(尽管任务仍在运行),chrome有时会加载“无数据接收页”。 有没有办法在我的任务正在思考时放置一个临时页面,或者只是强制chrome继续等待?提前致谢 问题答案: 尽管

  • 有什么想法吗? 谢谢

  • 我有一个用两个螺栓处理文档的拓扑结构。我需要能够在文档被完全处理/通过整个拓扑结构后修改存储在喷口中的数据结构。在进一步了解ApacheStorm之前,我相信在spout中实现的“ack”方法只在拓扑的末尾被调用。我现在明白了,在每一个插销中都需要调用“ack”,我感到困惑。 本质上,如果我把自定义代码放在spout中的ack方法中:什么时候执行?每当'ack'方法被调用在一个螺栓或当整个元组树已