Skip to content

Commit 1b0232a

Browse files
committed
Make clean up buckets interval configurable
1 parent 0be0611 commit 1b0232a

5 files changed

Lines changed: 19 additions & 12 deletions

File tree

cmd/limiter/main.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"os"
66
"os/signal"
77
"syscall"
8+
"time"
89

910
"github.com/rs/zerolog"
1011
"github.com/rs/zerolog/log"
@@ -20,6 +21,8 @@ var (
2021
redisPort int // HTTP Port
2122
logLevel string // Log level
2223
logMode string // Log mode
24+
25+
cleanUpBucketsInterval = 300 // Clean up buckets interval in seconds
2326
)
2427

2528
func main() {
@@ -29,6 +32,7 @@ func main() {
2932
flag.IntVar(&redisPort, "redis_port", 46379, "Redis Port")
3033
flag.StringVar(&logMode, "log_mode", "console", "Log mode: console, stackdriver")
3134
flag.StringVar(&logLevel, "log_level", "info", "Log level")
35+
flag.IntVar(&cleanUpBucketsInterval, "cleanup_interval", 300, "Clean up buckets interval in seconds")
3236

3337
flag.Parse()
3438

@@ -39,7 +43,7 @@ func main() {
3943

4044
zerolog.TimeFieldFormat = zerolog.TimeFormatUnix
4145

42-
rateLimiter := limiter.NewRateLimiter()
46+
rateLimiter := limiter.NewRateLimiter(time.Duration(cleanUpBucketsInterval) * time.Second)
4347
go rateLimiter.StartCleanUpFullBuckets()
4448

4549
app := http_server.NewApp(

pkg/limiter/benchmark_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import (
99

1010
func BenchmarkReduce_100_1000_1_1000_1(b *testing.B) {
1111
numberOfKeys := 1000
12-
rl := NewRateLimiter()
12+
rl := NewRateLimiter(300 * time.Second)
1313

1414
b.RunParallel(func(pb *testing.PB) {
1515
r := rand.New(rand.NewSource(time.Now().UnixNano()))
@@ -22,7 +22,7 @@ func BenchmarkReduce_100_1000_1_1000_1(b *testing.B) {
2222
}
2323
func BenchmarkReduce_10000000_1000_10_1000_10(b *testing.B) {
2424
numberOfKeys := 10000000
25-
rl := NewRateLimiter()
25+
rl := NewRateLimiter(300 * time.Second)
2626

2727
b.RunParallel(func(pb *testing.PB) {
2828
r := rand.New(rand.NewSource(time.Now().UnixNano()))

pkg/limiter/limiter.go

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,13 @@ type Shard struct {
2727
type RateLimiter struct {
2828
shards []*Shard
2929
length int64
30+
31+
cleanUpBucketsInterval time.Duration
3032
}
3133

32-
func NewRateLimiter() *RateLimiter {
34+
func NewRateLimiter(cleanUpBucketsInterval time.Duration) *RateLimiter {
3335
rateLimiter := new(RateLimiter)
36+
rateLimiter.cleanUpBucketsInterval = cleanUpBucketsInterval
3437

3538
rateLimiter.shards = make([]*Shard, SHARDS)
3639

@@ -133,7 +136,7 @@ func (l *RateLimiter) CleanUpFullBuckets() {
133136

134137
func (l *RateLimiter) StartCleanUpFullBuckets() {
135138
for {
136-
time.Sleep(60 * time.Second)
139+
time.Sleep(l.cleanUpBucketsInterval)
137140
started := time.Now()
138141

139142
l.CleanUpFullBuckets()

pkg/limiter/limiter_test.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import (
1010

1111
func TestSlowRateLimiter(t *testing.T) {
1212

13-
rl := NewRateLimiter()
13+
rl := NewRateLimiter(300 * time.Second)
1414

1515
val, _ := rl.Reduce("login", 5, 2, 5, 1)
1616
assert.Equal(t, int64(4), val)
@@ -46,7 +46,7 @@ func TestSlowRateLimiter(t *testing.T) {
4646

4747
func TestFastRateLimiter(t *testing.T) {
4848

49-
rl := NewRateLimiter()
49+
rl := NewRateLimiter(300 * time.Second)
5050

5151
for i := 999; i >= 0; i-- {
5252
val, _ := rl.Reduce("api_call", 1000, 1, 1000, 1)
@@ -66,7 +66,7 @@ func TestFastRateLimiter(t *testing.T) {
6666
}
6767

6868
func TestRateLimiterWithManyKeys(t *testing.T) {
69-
rl := NewRateLimiter()
69+
rl := NewRateLimiter(300 * time.Second)
7070

7171
for i := 1000_000; i >= 0; i-- {
7272
val, _ := rl.Reduce(fmt.Sprintf("api_call:%d", i), 1000, 1, 1000, 1)
@@ -76,7 +76,7 @@ func TestRateLimiterWithManyKeys(t *testing.T) {
7676

7777
func TestRateLimiterReuseTheSameKey(t *testing.T) {
7878

79-
rl := NewRateLimiter()
79+
rl := NewRateLimiter(300 * time.Second)
8080

8181
val, _ := rl.Reduce("user:123", 1000, 1, 50, 1)
8282
assert.Equal(t, int64(999), val)
@@ -93,7 +93,7 @@ func TestRateLimiterReuseTheSameKey(t *testing.T) {
9393
}
9494

9595
func TestRateLimiterD(t *testing.T) {
96-
rl := NewRateLimiter()
96+
rl := NewRateLimiter(300 * time.Second)
9797

9898
val, _ := rl.Reduce("api_call", 100, 1, 10, 10)
9999
assert.Equal(t, int64(90), val)
@@ -107,7 +107,7 @@ func TestRateLimiterD(t *testing.T) {
107107
}
108108

109109
func TestCleanUpFullBuckets(t *testing.T) {
110-
rl := NewRateLimiter()
110+
rl := NewRateLimiter(300 * time.Second)
111111

112112
assert.Equal(t, int64(0), rl.Len())
113113

pkg/redis_server/redis_server_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ func TestServerBasic(t *testing.T) {
2222
port := 56379
2323

2424
app := &http_server.App{
25-
RateLimiter: limiter.NewRateLimiter(),
25+
RateLimiter: limiter.NewRateLimiter(300 * time.Second),
2626
PathMap: make(map[string]string),
2727
}
2828

0 commit comments

Comments
 (0)