Apache Storm:限制生成的元组数量(在特定时间范围内)

Apache Storm: Limit the number of tuples produced (in a certain time frame)

根据我的理解,ackfailnextTuple 函数是在紧密循环中使用同一线程调用的,正如 ISpout Javadoc 所建议的:

nextTuple, ack, and fail are all called in a tight loop in a single thread in the spout task.

假设我们有一个合成元组生成器,我们想要限制每秒由 spout 发出的元组数量。如何实现?放一个 sleep() 是个好主意吗?有替代方法吗?

睡眠可能不是最好的主意,因为它会阻止 spout 处理传入的 ack。看这里:

我只会计算发出的元组并记住时间戳。如果超出了每个时间单位的元组数,并且时间单位没有过去,则只从 nextTuple() return 不发出任何元组。当时间单位过去时,将计数器重置为零,将时间戳提前时间单位,然后恢复发射。等等第四。