我有一个跨越4个Unix节点的分布式环境中运行的Storm拓扑。
我有一个JMSSpout,它接收一条消息,然后将其转发到ParseBolt上,它将解析原始消息并创建一个对象。
为了帮助测量延迟,我的JMSSpout发出当前时间作为值,然后当ParseBolt接收到该值时,它将再次获取当前时间,并将差值作为延迟。
使用这种方法,我看到200毫秒以上的声音听起来根本不正确。有谁知道为什么会这样吗?
最佳答案
这可能是线程问题。 Storm对所有喷口nextTuple()调用使用相同的线程,并且在nextTuple()调用结束之前不会处理发出的元组。还有一个非常紧密的循环,该循环反复调用nextTuple()方法,如果您在nextTuple()实现中至少没有短暂的睡眠,它可能会占用很多周期。
尝试添加一个sleep(10),然后每个nextTuple()仅发出一个元组。