dty*_*dty 2 math message-queue rate
我需要测量软件系统消耗来自消息队列的消息的速率并定期报告.
具体来说,消息从消息排队系统到达,我需要报告(每秒)在多个滚动窗口内收到的消息数量 - 例如最后一秒,最后5秒,最后30秒等.
虽然我确信我可以建立这个,但我不确定我会以最有效的方式解决这个问题!我也确定有这样的库(我正在使用JVM,因此我想到了Apache Commons Math),但我甚至不知道Google的正确用语!:-)
这是我基于指数平滑的解决方案.它不需要任何后台线程.您将为要跟踪的每个滚动窗口创建1个实例.对于每个相关事件,您将在每个实例上调用newEvent.
public class WindowedEventRate {
private double normalizedRate; // event rate / window
private long windowSizeTicks;
private long lastEventTicks;
public WindowedEventRate(int aWindowSizeSeconds) {
windowSizeTicks = aWindowSizeSeconds * 1000L;
lastEventTicks = System.currentTimeMillis();
}
public double newEvent() {
long currentTicks = System.currentTimeMillis();
long period = currentTicks - lastEventTicks;
lastEventTicks = currentTicks;
double normalizedFrequency = (double) windowSizeTicks / (double) period;
double alpha = Math.min(1.0 / normalizedFrequency, 1.0);
normalizedRate = (alpha * normalizedFrequency) + ((1.0 - alpha) * normalizedRate);
return getRate();
}
public double getRate() {
return normalizedRate * 1000L / windowSizeTicks;
}
}
Run Code Online (Sandbox Code Playgroud)