> 백엔드 개발 > Golang > 속도 제한기란 무엇이며 왜 사용합니까?

속도 제한기란 무엇이며 왜 사용합니까?

Mary-Kate Olsen
풀어 주다: 2025-01-08 06:36:40
원래의
878명이 탐색했습니다.

웹 시스템은 짧은 시간 내에 수많은 클라이언트 요청으로 인해 어려움을 겪는 경우가 많습니다. 이로 인해 서버가 과부하되어 속도 저하나 오류가 발생할 수 있습니다. 비율 제한기는 각 클라이언트의 요청 빈도를 제어하여 이 문제를 우아하게 해결합니다. 지정된 시간 내에 API 또는 서비스 호출을 제한하는 문지기 역할을 합니다.

비율 제한을 구현하는 이유는 무엇입니까?

속도 제한은 다음과 같은 몇 가지 중요한 이점을 제공합니다.

  1. 남용 방지: 서비스 거부(DoS) 공격과 같은 과도하거나 악의적인 요청을 완화하여 시스템 과부하를 방지합니다.

  2. 리소스 관리: 효율적인 리소스 할당을 보장하여 한 클라이언트가 서버 리소스를 독점하여 다른 클라이언트에 영향을 미치는 것을 방지합니다.

  3. 성능 향상: 요청 폭주를 방지하여 트래픽 부하가 높은 상황에서도 애플리케이션 응답성을 유지합니다.

  4. 사용자 경험 개선: 과도한 요청으로 인한 사용자 잠금이나 성능 저하를 방지합니다.

  5. 보안 강화: 요청 비율을 제한하여 무차별 대입 공격이나 악용 시도를 방지하는 데 도움이 됩니다.

치와 함께하는 실전 바둑 구현

인기 있는 Chi 라우팅 패키지와 golang.org/x/time/rate 패키지(토큰 버킷 알고리즘 사용)를 사용하여 Go 구현을 살펴보겠습니다. 이 예에서는 http.Handler을 사용하여 클라이언트 요청 비율을 제어합니다.

<code class="language-go">package main

import (
    "encoding/json"
    "net/http"
    "strings"
    "time"

    "github.com/go-chi/chi"
    "golang.org/x/time/rate"
)

func main() {
    r := chi.NewRouter()

    // Globally limits to 5 requests per second with a burst of 10
    r.Use(RateLimiter(rate.Limit(5), 10, 1*time.Second))

    // Test route
    r.Get("/", func(w http.ResponseWriter, r *http.Request) {
        w.Write([]byte("Request successful"))
    })

    http.ListenAndServe(":3000", r)
}

// RateLimiter middleware
func RateLimiter(limit rate.Limit, burst int, waitTime time.Duration) func(next http.Handler) http.Handler {
    limiterMap := make(map[string]*rate.Limiter)
    lastRequestMap := make(map[string]time.Time)

    return func(next http.Handler) http.Handler {
        return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
            ip := strings.Split(r.RemoteAddr, ":")[0]

            limiter, exists := limiterMap[ip]
            if !exists {
                limiter = rate.NewLimiter(limit, burst)
                limiterMap[ip] = limiter
            }

            lastRequestTime, lastRequestExists := lastRequestMap[ip]
            if lastRequestExists && time.Since(lastRequestTime) < waitTime {
                //Handle exceeding rate limit
                http.Error(w, http.StatusText(http.StatusTooManyRequests), http.StatusTooManyRequests)
                return
            }

            if !limiter.Allow() {
                http.Error(w, http.StatusText(http.StatusTooManyRequests), http.StatusTooManyRequests)
                return
            }

            lastRequestMap[ip] = time.Now()
            next.ServeHTTP(w, r)
        })
    }
}</code>
로그인 후 복사
  • 버스트: 평균 속도를 초과하는 짧은 요청 버스트를 허용합니다.

비율 제한을 초과하면 429 (Too Many Requests) 오류가 발생합니다.

What is Rate Limiter and Why Use It?

속도 제한 전략

클라이언트 사용량을 식별하고 제한하는 방법에는 여러 가지가 있습니다.

  1. IP 기반: 특정 IP 주소의 요청을 제한합니다. 간단하지만 공유 네트워크(NAT)에서는 비효율적입니다.

  2. 인증 토큰 기반: 인증 토큰(JWT, OAuth)을 기반으로 요청을 추적합니다. 더욱 세부적이지만 인증이 필요합니다.

  3. 클라이언트 ID 기반: 고유한 클라이언트 ID(API 키)를 사용합니다. 서비스 통합에는 효과적이지만 키가 손상되면 취약합니다.

  4. 사용자별 세션: 고유 세션 식별자를 기반으로 요청을 제한합니다. 개인의 사용자 경험에 중점을 둡니다.

  5. 경로/엔드포인트 기반: 트래픽이 많은 특정 엔드포인트로 요청을 제한합니다. 다른 방법과 잘 결합됩니다.

이 예에서는 토큰 기반 인증이 없는 공용 API 또는 애플리케이션에 적합한 IP 주소를 사용하여 단순화했습니다.

결론

비율 제한은 애플리케이션 보안, 안정성 및 사용자 경험에 필수적입니다. 이 예에서는 Go 및 Chi를 사용한 실용적이고 효율적인 구현을 보여줍니다. 이는 남용을 방지하고 공정한 자원 분배를 보장하는 중요한 기술입니다.

링크

블로그 게시물

예시 저장소

위 내용은 속도 제한기란 무엇이며 왜 사용합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿