예제 #1
0
        /// <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);
        }
예제 #2
0
        public LeakageBucketLimitingService(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);
            cancelToken  = new CancellationTokenSource();
            task         = Task.Factory.StartNew(new Action(TokenProcess), cancelToken.Token);
        }
예제 #3
0
        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);
        }