-
Notifications
You must be signed in to change notification settings - Fork 24
/
system_rate_limit.go
50 lines (36 loc) · 1.04 KB
/
system_rate_limit.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
package controllers
import (
"time"
"golang.org/x/time/rate"
)
type SystemRolloutReservation interface {
Cancel()
}
type SystemRolloutRateLimiter interface {
Reserve() (allowed bool, reservation SystemRolloutReservation)
}
var _ SystemRolloutRateLimiter = &systemRolloutRateLimiter{}
type systemRolloutRateLimiter struct {
rateLimit *rate.Limiter
}
func NewSystemRolloutRateLimiter(operations int, interval time.Duration) SystemRolloutRateLimiter {
return &systemRolloutRateLimiter{
rateLimit: rate.NewLimiter(rate.Every(interval), operations),
}
}
func (r *systemRolloutRateLimiter) Reserve() (allowed bool, reservation SystemRolloutReservation) {
rateLimitReservation := r.rateLimit.Reserve()
if !rateLimitReservation.OK() {
return false, nil
}
if rateLimitReservation.Delay() > time.Second {
rateLimitReservation.Cancel()
return false, nil
}
return true, rateLimitReservation
}
type noopReservation struct{}
func (*noopReservation) Cancel() {}
func NoopReservation() SystemRolloutReservation {
return &noopReservation{}
}