2015-11-01 124 views
6

我们有一个风暴拓扑,我们在其中配置了一个喷嘴和两个螺栓。 Spout不断从数据库中查询数据,并将它发送给第一个螺栓进行一些处理。第一个螺栓执行一些处理并将元组发送到第二个螺栓,该螺栓调用第三方Web服务并发送数据。所以,在一段时间后发生了什么,最后一个螺栓没有得到任何元组,如果我们重新启动拓扑,它工作正常。这里只有最后一个螺栓出现问题。其他喷口和第一个螺栓运行良好,我不使用acking框架。在这种情况下,我只配置了一名工人。阿帕奇风暴螺栓任务在一段时间后没有收到消息

TopologyBuilder builder = new TopologyBuilder(); 
    builder.setSpout("messageListenrSpout", new MessageListenerSpout(), 1); 
    builder.setBolt("processorBolt", new ProcessorBolt(), 20).shuffleGrouping("messageListenrSpout"); 
    builder.setBolt("notifierBolt", new NotifierBolt(),40).shuffleGrouping("processorBolt"); 
    Config conf = new Config(); 
     conf.put(Config.TOPOLOGY_SLEEP_SPOUT_WAIT_STRATEGY_TIME_MS, 10000); 
     //conf.setMessageTimeoutSecs(600); 
     conf.setDebug(true); 
     StormSubmitter.submitTopology(TOPOLOGY, conf, builder.createTopology()); 

回答

2

这很可能是因为导致超时的元组积压问题。尝试增加第二个螺栓的平行度提示,因为它听起来像一个人的加工时间比第一个螺栓要长得多(这就是为什么第二个螺栓会有积压)。如果您在群集上运行此拓扑,请查看Storm UI以查看具体信息。

+0

嗨克里斯,我没有使用acking框架。风暴还会超时吗?如果邮件超时,我们可以在哪里检查日志。我已经给出了最后一个螺栓的30个平行度提示。 –

1

当我调试我的拓扑结构时,我发现如果让喷嘴快速发送消息但螺栓处理速度很慢。在这种情况下,消息将在LMAX Disruptor队列中排队。然后喷嘴任务等待它为空。如果你进行线程转储,你会发现线程处于TIMED_WAITING状态。所以,我们需要以保持流入和流出的方式来配置拓扑结构。