Java 风暴发射执行延迟

Java 风暴发射执行延迟,java,apache-storm,Java,Apache Storm,我有一个Storm拓扑在分布式环境中跨4个Unix节点运行 我有一个JMSSpout,它接收一条消息,然后将其转发到一个ParseBolt上,该ParseBolt将解析原始消息并创建一个对象 为了帮助测量延迟,我的JMSSpout将当前时间作为一个值发出,然后当ParseBolt接收到这个值时,它将再次获得当前时间,并将差值作为延迟 使用这种方法,我看到200+毫秒,这听起来根本不正确。有人知道为什么会这样吗?这可能是线程问题。Storm对所有spout nextTuple()调用使用相同的线程

我有一个Storm拓扑在分布式环境中跨4个Unix节点运行

我有一个JMSSpout,它接收一条消息,然后将其转发到一个ParseBolt上,该ParseBolt将解析原始消息并创建一个对象

为了帮助测量延迟,我的JMSSpout将当前时间作为一个值发出,然后当ParseBolt接收到这个值时,它将再次获得当前时间,并将差值作为延迟


使用这种方法,我看到200+毫秒,这听起来根本不正确。有人知道为什么会这样吗?

这可能是线程问题。Storm对所有spout nextTuple()调用使用相同的线程,直到nextTuple()调用结束,才会处理发出的元组。还有一个非常紧密的循环,它反复调用nextTuple()方法,如果在nextTuple()实现中不进行至少一次短暂的睡眠,它可能会消耗大量的周期


尝试添加一个sleep(10)并每nextTuple()只发出一个元组。

Ah这很有意义。我正在bolt中进行一些解析,我认为nextTuple()调用需要一段时间才能完成,因此我的元组会在后台进行备份(并增加额外的延迟)。通过删除解析逻辑来测试我的bolt,现在速度快多了。但是,如果我无法改进解析功能,那么我还能做些什么来提高效率?我和Nathan找到了一个线程,我说的是制作一个多线程的喷口来加速nextTuple()进程。(顺便说一句,在中添加sleep函数也为我节省了10毫秒,因此非常感谢)。如果这是中间螺栓(解析螺栓),为什么不增加并行性提示以生成更多实例?我假设您现在没有在节点上最大化CPU。我将这个特殊螺栓的并行性提示增加到4,我们看到了显著的性能提高。谢谢你的建议。