Rate Limiting

Rate Limiting이란 중요한 메커니즘으로 자원사용량을 제한하거나 서비스의 대역폭을 제한하는 것을
의미합니다. Go에서는 goroutine + channels + tickers를 이용해서 쉽고 우아하게 처리할 수 있습니다.

package main

import "time"
import "fmt"

func main() {

    requests := make(chan int, 5)                            // [1]
    for i := 1; i <= 5; i++ {
        requests <- i
    }
    close(requests)

    limiter := time.Tick(time.Millisecond * 200)             // [2]

    for req := range requests {                              // [3]
        <-limiter
        fmt.Println("request", req, time.Now())
    }

    burstyLimiter := make(chan time.Time, 3)                 // [4]

    for i := 0; i < 3; i++ {                                 // [5]
        burstyLimiter <- time.Now()
    }

    go func() {                                              // [6]
        for t := range time.Tick(time.Millisecond * 200) {
            burstyLimiter <- t
        }
    }()

    burstyRequests := make(chan int, 5)                      // [7]
    for i := 1; i <= 5; i++ {
        burstyRequests <- i
    }
    close(burstyRequests)

    for req := range burstyRequests {
        <-burstyLimiter
        fmt.Println("request", req, time.Now())
    }
}
  1. 먼저 기본적인 제한을 사용하겠습니다. 처리요구량을 제한하는 것입니다.
    채널을 이용해서 요청을 제한하고 있습니다.
  2. limiter 채널은 0.2초마다 값을 수신하고 있습니다. 제한에 대한 기본적이 시간을 제공합니다.
  3. limiter에서 각 요청을 제공하기 전의 메세지는 블럭상태 입니다.
    0.2초마다 요청을 제한할 수 있습니다.