我们有一个风暴拓扑,我们在其中配置了一个喷口和两个螺栓。 Spout不断地从DB查询数据,并将元组发送到第一个bolt进行一些处理。第一个bolt执行一些处理并将元组发送到第二个bolt,它调用第三方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());
答案 0 :(得分:2)
你很可能遇到导致超时的积压元组问题。尝试增加第二个螺栓的平行度提示,因为它听起来像一个人的处理时间比第一个螺栓的处理时间长得多(这就是为什么会有积压进入第二个螺栓)。如果您在群集上运行此拓扑,请查看Storm UI以查看详细信息。
答案 1 :(得分:1)
当我调试我的拓扑时,我发现如果让我们说spout正在快速发送消息但是bolt处理速度很慢。在这种情况下,消息将排队LMAX Disruptor Queue。然后spout task等待它为空。如果你进行线程转储,你会发现线程处于TIMED_WAITING状态。因此,我们需要以保持其流入和流出的方式配置拓扑。