golang.org/x/time/rate
속도 제한기 사용하기
golang.org/x/time/rate은(는) CoddyKit의 무료 Go Academy 강의입니다. 이것은 4개 중 2번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Go Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Go Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
속도 제한 패키지
golang.org/x/time/rate는 실무에 바로 사용할 수 있는 토큰 버킷 Limiter를 제공합니다. Go에서 속도 제한을 구현할 때 표준적으로 선택하는 도구입니다.
- 충분히 검증된 구현
- Allow, Wait, Reserve 메서드
- 컨텍스트 인식
제한기 생성하기
rate.NewLimiter는 속도(초당 토큰 수)와 순간 처리량을 받습니다. rate.Limit은 초당 이벤트 수를 나타내는 float64입니다.
limiter := rate.NewLimiter(rate.Limit(10), 5)rate.Every
초당 속도보다 간격으로 생각하는 경우 rate.Every를 사용하여 지속 시간을 속도로 변환할 수 있습니다. 200밀리초마다 한 번 발생하는 것은 초당 5회와 같습니다.
limiter := rate.NewLimiter(rate.Every(200*time.Millisecond), 1)Allow
Allow는 지금 토큰을 사용할 수 있는지 알려줍니다. 토큰을 사용하고 true를 반환하거나, 즉시 false를 반환합니다. 초과 요청을 거부할 때 사용하세요.
if !limiter.Allow() {
fmt.Println("rejected: too many requests")
return
}Wait
Wait는 토큰을 사용할 수 있거나 컨텍스트가 취소될 때까지 차단합니다. 작업을 버리는 대신 속도를 조절하고 싶을 때 적합합니다.
if err := limiter.Wait(ctx); err != nil {
return err
}
doWork()Reserve
Reserve는 얼마나 기다려야 하는지 설명하는 Reservation을 반환합니다. 기다릴 시간을 확인하려면 Delay()를 호출하고, 진행하지 않기로 했다면 Cancel()을 호출하세요.
r := limiter.Reserve()
if !r.OK() {
return
}
time.Sleep(r.Delay())참고: 외부 패키지
rate 패키지는 표준 라이브러리에 포함되어 있지 않으므로 go get golang.org/x/time/rate와 모듈이 필요합니다. 이를 가져오는 코드 조각은 설명을 위한 것이며 여기서 바로 실행되지 않습니다.
실행 가능한 표준 라이브러리 대안
rate 패키지는 외부 패키지이므로, 여기서는 200밀리초마다 신호를 보내며 Wait 동작을 흉내 내는 표준 라이브러리 기반 속도 조절 반복문을 살펴봅니다.
package main
import (
"fmt"
"time"
)
func main() {
tick := time.NewTicker(200 * time.Millisecond)
defer tick.Stop()
for i := 0; i < 4; i++ {
<-tick.C
fmt.Println("processed event", i)
}
}실행 중 조정하기
SetLimit과 SetBurst를 사용하여 실행 중에도 제한을 변경할 수 있습니다. 설정을 다시 불러오거나 상위 서비스에서 429 응답을 보내 속도를 낮춰야 할 때 유용합니다.
limiter.SetLimit(rate.Limit(20))
limiter.SetBurst(10)클라이언트별 제한기
뮤텍스로 보호되는 클라이언트 키와 *rate.Limiter의 매핑을 유지합니다. 해당 키에 대한 첫 요청에서 제한기를 만들고, 이후 요청에서는 재사용합니다.
func getLimiter(m map[string]*rate.Limiter, key string) *rate.Limiter {
if l, ok := m[key]; ok {
return l
}
l := rate.NewLimiter(rate.Limit(5), 10)
m[key] = l
return l
}HTTP 미들웨어
핸들러를 감싸 각 요청이 먼저 Allow()를 호출하게 합니다. 허용되지 않으면 HTTP 429 요청 과다 응답을 반환합니다. 이것이 서버 측 속도 제한의 표준 방식입니다.
빠른 확인
속도 제한 패키지에 대한 지식을 확인해 보십시오.
복습
golang.org/x/time/rate에 대해 배웠습니다:
- NewLimiter(rate, burst)는 버킷을 만듭니다
- rate.Every는 간격을 속도로 변환합니다
- Allow는 요청을 거부하고, Wait는 속도를 조절하며, Reserve는 지연 시간을 알려 줍니다
- SetLimit과 SetBurst로 실행 중 설정을 조정합니다
- 서버에서는 클라이언트별 맵과 HTTP 429를 사용합니다
AI 튜터와 함께 Go을(를) 배우세요 — 무료
브라우저에서 실제 코드를 작성하고 실행하며, 24/7 AI 튜터로부터 즉각적인 도움을 받고, 웹이나 앱에서 중단한 부분부터 계속 학습하세요.
- 코스
- 51
- 레슨
- 203
자주 묻는 질문
“golang.org/x/time/rate” 강의는 무료인가요?
네 — “golang.org/x/time/rate” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Go Academy 강의 전체를 잠금 해제할 수 있습니다. Go Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“golang.org/x/time/rate”에서 뭘 배우나요?
속도 제한기 사용하기 브라우저에서 직접 실행하는 실습 코드로 Go Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Go Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Go Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 2번째 강의입니다.
“golang.org/x/time/rate” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Go Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Go Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.