Tuesday, July 21, 2015

[Design] Limit the Request per Second - Shuatiblog.com



[Design] Limit the Request per Second - Shuatiblog.com
link
有一个接口叫 void setRPS(int num);
接下来不断有request过来,如何实现下面的接口,返回accept或者deny,



  • maintain a variable for the number of request processed/rejected.
    1. This variable must be atomic, thus a AtomicInteger.
    2. the variable is called 'count'
  • have a method to process request
    1. if count < limit, do it
    2. otherwise, reject
  • This is the most important: clear the count every 1 seconds!
    1. eg. LIMIT = 5r/s, so:
    2. the first 5 number of requests in every second are getting fulfilled
    3. from 6th request onward, the request all rejected, until the next second.

  • public class SetRps {

        AtomicInteger count = new AtomicInteger(0);
        int limit = -1;
        int printIndex = 1;
        long startTimestamp = -1;

        void setRPS(int num) {
            limit = num;
        }

        boolean process(long timestamp) {
            // suppose timestamp is ms
            synchronized (this) {
                if (timestamp - startTimestamp >= 1000) {
                    // every 1 seconds, reset
                    count.set(0);
                    startTimestamp = timestamp;
                    System.out.println("clear!");
                    return true;
                }      
                if (count.get() < limit) {
                    // can process
                    count.incrementAndGet();
                    System.out.println(printIndex++ + ". processing request "
                            + timestamp % 100000 / 1000 + "," + timestamp % 1000);
                    return true;
                }
            }
            return false;
        }
    }
    Google的Guava里提供了一个RateLimiter的class,可以做参考
    Google Guava RateLimiter

    Read full article from [Design] Limit the Request per Second - Shuatiblog.com

    Labels

    Review (572) System Design (334) System Design - Review (198) Java (189) Coding (75) Interview-System Design (65) Interview (63) Book Notes (59) Coding - Review (59) to-do (45) Linux (43) Knowledge (39) Interview-Java (35) Knowledge - Review (32) Database (31) Design Patterns (31) Big Data (29) Product Architecture (28) MultiThread (27) Soft Skills (27) Concurrency (26) Cracking Code Interview (26) Miscs (25) Distributed (24) OOD Design (24) Google (23) Career (22) Interview - Review (21) Java - Code (21) Operating System (21) Interview Q&A (20) System Design - Practice (20) Tips (19) Algorithm (17) Company - Facebook (17) Security (17) How to Ace Interview (16) Brain Teaser (14) Linux - Shell (14) Redis (14) Testing (14) Tools (14) Code Quality (13) Search (13) Spark (13) Spring (13) Company - LinkedIn (12) How to (12) Interview-Database (12) Interview-Operating System (12) Solr (12) Architecture Principles (11) Resource (10) Amazon (9) Cache (9) Git (9) Interview - MultiThread (9) Scalability (9) Trouble Shooting (9) Web Dev (9) Architecture Model (8) Better Programmer (8) Cassandra (8) Company - Uber (8) Java67 (8) Math (8) OO Design principles (8) SOLID (8) Design (7) Interview Corner (7) JVM (7) Java Basics (7) Kafka (7) Mac (7) Machine Learning (7) NoSQL (7) C++ (6) Chrome (6) File System (6) Highscalability (6) How to Better (6) Network (6) Restful (6) CareerCup (5) Code Review (5) Hash (5) How to Interview (5) JDK Source Code (5) JavaScript (5) Leetcode (5) Must Known (5) Python (5)

    Popular Posts