package com.sohu.sns.data.recommend.server.utils.tokenBucket;
import static java.util.concurrent.TimeUnit.MICROSECONDS;
import static java.util.concurrent.TimeUnit.NANOSECONDS;
/**
*
*/
public abstract class RateLimiter {
protected double maxTokens;
protected double availableTokens;
protected long startNanos;
protected long nextGenTokenMicros;
protected double stableIntervalTokenMicros;
protected final Object mutex = new Object();
public void setRate(double tokenPerSecond){
if (tokenPerSecond < 0 ){
throw new IllegalArgumentException("tokenPerSecond must be positive.");
}
synchronized (mutex){
doSetRate(tokenPerSecond);
}
}
protected abstract void doSetRate(double tokenPerSecond);
public abstract void syncAvailableToken(long nowMicros);
public abstract double getToken(double requiredToken);
public long duration(){
return MICROSECONDS.convert(System.nanoTime() - startNanos,NANOSECONDS);
}
public static Builder builder(){
return new Builder();
}
public static class Builder<T extends RateLimiter> {
private double tokenPerSecond;
private RateLimiterType type;
public Builder withType(RateLimiterType type){
this.type = type;
return this;
}
public Builder withTokenPerSecond(double tokenPerSecond){
this.tokenPerSecond = tokenPerSecond;
return this;
}
public T build(){
switch (type){
case TB:
return (T)buildSmoothTokenBucketLimiter();
case LB:
return null;
case FFTB:
return (T)buildFailFastTokenBucketLimiter();
default:
return (T)buildSmoothTokenBucketLimiter();
}
}
private SmoothTokenBucketLimiter buildSmoothTokenBucketLimiter(){
SmoothTokenBucketLimiter limiter = new SmoothTokenBucketLimiter();
limiter.startNanos = System.nanoTime();
limiter.setRate(tokenPerSecond);
return limiter;
}
private FailFastTokenBucketLimiter buildFailFastTokenBucketLimiter(){
FailFastTokenBucketLimiter limiter = new FailFastTokenBucketLimiter();
limiter.startNanos = System.nanoTime();
limiter.setRate(tokenPerSecond);
return limiter;
}
}
public static enum RateLimiterType {
/**
* token bucket
*/
TB,
/**
* leaky bucket
*/
LB,
/**
* 没有可用token 抛出异常的token bucket
*/
FFTB;
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
tokenBucket.rar (6个子文件)
tokenBucket
FailFastTokenBucketLimiter.java 1KB
testratelimiter.java 812B
AbstractTokenBucketLimiter.java 813B
RateLimiter.java 3KB
SmoothTokenBucketLimiter.java 2KB
LimitedException.java 449B
共 6 条
- 1
资源评论
- YM562362017-09-14不错,看看源码!
- piaxiaohui2018-09-28找点思路 看看
- 逆光C2018-03-09不错,找点新思路
haozi_ncepu
- 粉丝: 179
- 资源: 16
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功