Published on

API Service with Go: Rate Limit

Authors

Rate Limit

ในบางครั้ง api ของเราจะต้องใช้เวลาในการทำงานนาน ไม่ว่าจะเป็นคิวรี่ข้อมูล หรือไปเรียกใช้งาน api ภายนอก เราจะต้องป้องกัน api ของเราด้วยการกำหนดจำนวนสูงในการรับ request ต่อวินาทีเอาไว้ โดยช้ package golang.org/x/time/rate

ตัวอย่าง ถ้าต้องการกำหนดให้รับ 10 req/sec ให้กำหนดแบบนี้ limiter := rate.Newlimiter(10, 1) โดย 10 คือจำนวน limit per sec และ 1 คือ ขนาดของ burst size หรือจะกำหนดเป็น limiter := rate.Newlimiter(5, 5) ก็ได้

main.go
package main
import (
  "fmt"
  "log"
  "net/http"
  "golang.org/x/time/rate"
)
func main() {
  limiter := rate.NewLimiter(10, 1)
  http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request){
    if !limiter.Allow() {
      w.WriteHeader(http.StatusTooManyRequests)
      return
    }
  fmt.Fprintln(w, "Hello, World")
  })
  log.Fatal(http.ListenAndServe(":8080", nil))
}