我目前在风暴中测量一种新的分组方法,因此吞吐量和延迟最重要,但在测量每个元组的端到端延迟时遇到了一些困难。
我尝试在元组内部加时间戳并计算在拓扑下游收到它时的延迟,但结果中存在负数。
因为我在群集模式下运行拓扑,所以无法在群集中的机器之间精确地同步时间(我尝试了NTP
,但它也不够精确),这可能是问题的原因。
Storm本身也提供了某种方法来衡量每个元组的端到端延迟吗?或者我可以用来达到目的的任何技巧?
答案 0 :(得分:1)
终于得到了解决方案!
我们实现了自己的spout并实现了IRichSpout接口,在我们的nextTuple()
方法中,我们为元组分配了一个唯一ID,并将时间戳放入ConcurrentHashMap
,然后通过这样做发出ID
collector.emit(new Values(str), ID);
让风暴意识到为元组分配了一个ID,因此在我们的ack(Object msgId)
方法中,我们通过给出键msgId
来检查hashmap中的时间,将它与当前时间进行比较,我们得到了这个元组的延迟!
当我们将spout parallelism设置为1时,我们不必再担心时间同步问题了。