간단한 로드밸런서와 HTTP 프록시 서버 구현
레이트 리미터
Limiter interface
package limiter
type Limiter interface {
TryTake([]byte) (bool, int)
}레이트 리미터 객체가 구현해야할 인터페이스로 Limiter 인터페이스가 있습니다. 바이트 슬라이스를 받아서 해당 슬라이스를 기반으로 레이트 리밋을 계산하여 이번 요청이 사용 가능하면 true와 적절한 status code를 반환합니다.
slide count struct
type SlideCount struct {
lock *lock.Lock
unit int64
maxConnPer float64
prevTime int64
prevCount int64
curCount int64
nextTime int64
}
func New(maxConnPer float64, unit time.Duration) limiter.Limiter {
now := int64(time.Now().UnixNano())
return &SlideCount{
lock: new(lock.Lock),
unit: int64(unit),
maxConnPer: maxConnPer,
prevTime: now - int64(unit),
prevCount: 0,
curCount: 0,
nextTime: now + int64(unit),
}
}슬라이드 카운트 구조체는 sliding window count 방식의 레이트 리밋을 구현한 것입니다. 일반적인 케이스와 달리 제 주관적인 해석이 들어가 있으므로 코드가 좀 다릅니다.
