【系统设计】Design Netflix & Design User System & Design Rate Limiter - Road to Glory - SegmentFault



【系统设计】Design Netflix & Design User System & Design Rate Limiter - Road to Glory - SegmentFault

Design Rate Limiter

Requirement

防止爬虫;例如,Kafka中上层producer产生太快限制其他producer的资源。
基本限制 QPS limit = 5

四种算法

1. 隔离算法 —

Make sure the gap between two requests >= 1s/5 = 0.2s

1. 充分满足限制;  2. 但是会误杀很多合理的request,例如0.2 0.4 0.6 0.8 0.9中的0.9         Acquire()  Time now = Time.getCurrentSecond();  if (now - lastReq <= 0.2) return false;  else {      lastReq = now;      return true;  }    

2. 吊桶算法 — time-bucket

Acquire()  Time now = Time.getCurrentSecond();  if (counter[now] >= 5) return false;  else {      counter[now]++;      return true;  }      

Time-bucket with Database: O(1) space

Acquire()  Time now = Time.getCurrentSecond();  counter = DB.get(now);  if (counter != null && counter >= 5) return false;  else {      DB.increase(s, 1);      DB.expire(s, 1);      return true;  }      

Time-bucket: one bucket O(1) space

Acquire()  Time curSecond = Time.getCurrentSecond();  if (curSecond != preSecond) {      counter = 0;      preSecond = curSecond;  }  if (counter >= 5) return false;  else {      counter++;      return true;  }  

Bad Case: 假设0 - 1s正好5个request,但是0.5s - 1.5s中出现了6个request,bucket无法检测任何一个1s区间内的准确性

3. Solution: 队列算法 — Algorithm of Request List

Acquire()  curSecond = getCurrentSecond();  preFifthSecond = requestList.get(requestList.size()-5);  if (curSecond-preFifthSecond < 1) return false; //indicating this is the 6th request in this second  else {      requestList.add(curSecond);      return true;  }      

还是有问题:如果一秒有很多request,比如说one million, 都要记录在request list吗?
Nah...
用一个fixed size(5)的request list + 轮询:只记录最近的5个request

Acquire()  curSecond = getCurrentSecond();  if (curSecond-requestList.get(index) < 1) return false;  else {      requestList.set(index, curSecond);      index = (index+1)%5;      return true;  }    

Follow up 1: how to save space with 10^9 queries per hour?

Batch queries. 损失精度换取空间复杂度。
对邻近时间的query打包,每个包里有10^6个query,这样,就只需要在request list中存储10^3个query/hr,也就是每3.6秒存储一个。

Follow up 2: how to support multiple threads?

Lock.

Follow up 3: how to support limiter on users?

<userId, requestList> 每个用户有自己的request list

Follow up 4: how to support query with different quotas? 不同配额呢

acquire(quota)

4. 令牌算法 — Token bucket

每0.2s产生一个令牌,没有使用的话则累积,供并发请求调用,时间为O(1)


Read full article from 【系统设计】Design Netflix & Design User System & Design Rate Limiter - Road to Glory - SegmentFault


No comments:

Post a Comment

Labels

Algorithm (219) Lucene (130) LeetCode (97) Database (36) Data Structure (33) text mining (28) Solr (27) java (27) Mathematical Algorithm (26) Difficult Algorithm (25) Logic Thinking (23) Puzzles (23) Bit Algorithms (22) Math (21) List (20) Dynamic Programming (19) Linux (19) Tree (18) Machine Learning (15) EPI (11) Queue (11) Smart Algorithm (11) Operating System (9) Java Basic (8) Recursive Algorithm (8) Stack (8) Eclipse (7) Scala (7) Tika (7) J2EE (6) Monitoring (6) Trie (6) Concurrency (5) Geometry Algorithm (5) Greedy Algorithm (5) Mahout (5) MySQL (5) xpost (5) C (4) Interview (4) Vi (4) regular expression (4) to-do (4) C++ (3) Chrome (3) Divide and Conquer (3) Graph Algorithm (3) Permutation (3) Powershell (3) Random (3) Segment Tree (3) UIMA (3) Union-Find (3) Video (3) Virtualization (3) Windows (3) XML (3) Advanced Data Structure (2) Android (2) Bash (2) Classic Algorithm (2) Debugging (2) Design Pattern (2) Google (2) Hadoop (2) Java Collections (2) Markov Chains (2) Probabilities (2) Shell (2) Site (2) Web Development (2) Workplace (2) angularjs (2) .Net (1) Amazon Interview (1) Android Studio (1) Array (1) Boilerpipe (1) Book Notes (1) ChromeOS (1) Chromebook (1) Codility (1) Desgin (1) Design (1) Divide and Conqure (1) GAE (1) Google Interview (1) Great Stuff (1) Hash (1) High Tech Companies (1) Improving (1) LifeTips (1) Maven (1) Network (1) Performance (1) Programming (1) Resources (1) Sampling (1) Sed (1) Smart Thinking (1) Sort (1) Spark (1) Stanford NLP (1) System Design (1) Trove (1) VIP (1) tools (1)

Popular Posts