在我的拓扑结构中,当将元组从喷口转移到螺栓或从螺栓转移到螺栓时,我看到大约1-2毫秒的延迟。我正在使用纳秒时间戳计算延迟,因为整个拓扑在单个工作器内运行。 拓扑在集群中运行,该集群在支持生产的硬件中运行。
据我所知,在这种情况下,元组不需要序列化/反序列化,因为所有内容都在单个JVM中。我已将大多数喷口和螺栓的平行度提示设置为5,而喷口仅以每秒100的速率生成事件。我不认为高延迟是由于事件排队导致的,因为我没有看到任何时间延迟增加。也没有内存增加。日志级别设置为ERROR。 CPU使用率在200到300%之间。
可能导致这种延迟的原因是什么?我期待只有少数我们的元组转移。
答案 0 :(得分:2)
我将假设您正在使用已发布的Storm版本之一,而不是2.0.0-SNAPSHOT,因为该版本中的排队实现已发生变化。
我认为延迟可能是因为Storm在将元组交付给消费者之前对元组进行批处理。查看https://github.com/apache/storm/blob/v1.2.1/storm-core/src/jvm/org/apache/storm/utils/DisruptorQueue.java#L247,并查看该文件中的Flusher类。当spout / bolt发布一个元组时,它会被放入_currentBatch列表中。它一直保持在那里,直到收到足够的元组,因此批处理“足够大”(你可以查看_inputBatchSize变量以确定它是什么时候),或直到Flusher被触发(默认情况下每毫秒发生一次)。 / p>