package org.springside.modules.utils.concurrent.throttle;
import org.apache.commons.lang3.Validate;
import org.springside.modules.utils.number.RandomUtil;
/**
* 采样器
*
* from Twitter Common, 优化使用ThreadLocalRandom
*
* @author calvin
*/
public class Sampler {
private static final Double ALWAYS = Double.valueOf(100);
private static final Double NEVER = Double.valueOf(0);
private double threshold;
protected Sampler() {
}
/**
* @param selectPercent 采样率,在0-100 之间,可以有小数位
*/
protected Sampler(double selectPercent) {
Validate.isTrue((selectPercent >= 0) && (selectPercent <= 100),
"Invalid selectPercent value: " + selectPercent);
this.threshold = selectPercent / 100;
}
/**
* 优化的创建函数,如果为0或100时,返回更直接的采样器
*/
public static Sampler create(Double selectPercent) {
if (selectPercent.equals(ALWAYS)) {
return new AlwaysSampler();
} else if (selectPercent.equals(NEVER)) {
return new NeverSampler();
} else {
return new Sampler(selectPercent);
}
}
/**
* 判断当前请求是否命中采样
*/
public boolean select() {
return RandomUtil.threadLocalRandom().nextDouble() < threshold;
}
/**
* 采样率为100时,总是返回true
*/
public static class AlwaysSampler extends Sampler {
@Override
public boolean select() {
return true;
}
}
/**
* 采样率为0时,总是返回false
*/
public static class NeverSampler extends Sampler {
@Override
public boolean select() {
return false;
}
}
}