/// <summary> /// 使用字典来存储 /// </summary> /// <param name="key"></param> /// <param name="rate"></param> /// <param name="limitSize"></param> public TokenBucketLimitingService(string key, string rate, int limitSize) { var rateSplits = rate.Split('/'); this.limitSize = limitSize; this.maxTPS = Convert.ToInt32(rateSplits[0]); unit = rateSplits[1]; if (this.limitSize <= 0) { this.limitSize = 100; } if (this.maxTPS <= 0) { this.maxTPS = 1; } limitedQueue = new LimitedQueue <object>(limitSize); for (int i = 0; i < limitSize; i++) { limitedQueue.Enqueue(new object()); } routeLimitedDic.Add(key, limitedQueue); cancelToken = new CancellationTokenSource(); //Task.Factory.StartNew不是直接创建线程,创建的是任务,它有一个任务队列,然后通过任务调度器把任务分配到线程池中的空闲线程中,如果任务的数量比线程池中的线程多,线程池的线程数量还没有到达上限,就会创建新线程执行任务。如果线程池的线程已到达上限,没有分配到线程的任务需要等待有线程空闲的时候才执行。 task = Task.Factory.StartNew(new Action(() => TokenProcessByRateInDic(key)), cancelToken.Token); }
/// <summary> /// 使用字典,定时消息令牌 /// </summary> private void TokenProcessByRateInDic(string key) { int sleepTime = BuildSleepTime(); while (cancelToken.Token.IsCancellationRequested == false) { Thread.Sleep(sleepTime); lock (lckObj) { int countAdd = this.limitSize - limitedQueue.Count; for (int i = 0; i < countAdd; i++) { limitedQueue.Enqueue(new object()); } routeLimitedDic[key] = limitedQueue; } } }
public bool Request() { if (limitedQueue.Count >= limitSize) { return(false); } lock (lckObj) { if (limitedQueue.Count >= limitSize) { return(false); } return(limitedQueue.Enqueue(new object())); } }
public TokenBucketLimitingService(int maxTPS, int limitSize) { this.limitSize = limitSize; this.maxTPS = maxTPS; if (this.limitSize <= 0) { this.limitSize = 100; } if (this.maxTPS <= 0) { this.maxTPS = 1; } limitedQueue = new LimitedQueue <object>(limitSize); for (int i = 0; i < limitSize; i++) { limitedQueue.Enqueue(new object()); } cancelToken = new CancellationTokenSource(); task = Task.Factory.StartNew(new Action(TokenProcess), cancelToken.Token); }