Skip to content

Commit 499903f

Browse files
authored
Add rate limiters for all the CloudMap's API calls. And optimize the rate limits of ListNamespaces. (#251)
1 parent 31f9eac commit 499903f

File tree

2 files changed

+31
-10
lines changed

2 files changed

+31
-10
lines changed

pkg/cloudmap/api.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,11 @@ func (sdApi *serviceDiscoveryApi) GetServiceIdMap(ctx context.Context, nsId stri
117117
}
118118

119119
func (sdApi *serviceDiscoveryApi) DiscoverInstances(ctx context.Context, nsName string, svcName string, queryParameters map[string]string) (insts []types.HttpInstanceSummary, err error) {
120+
err = sdApi.rateLimiter.Wait(ctx, common.DiscoverInstances)
121+
if err != nil {
122+
return nil, err
123+
}
124+
120125
input := &sd.DiscoverInstancesInput{
121126
NamespaceName: aws.String(nsName),
122127
ServiceName: aws.String(svcName),
@@ -151,6 +156,11 @@ func (sdApi *serviceDiscoveryApi) GetOperation(ctx context.Context, opId string)
151156
}
152157

153158
func (sdApi *serviceDiscoveryApi) CreateHttpNamespace(ctx context.Context, nsName string) (opId string, err error) {
159+
err = sdApi.rateLimiter.Wait(ctx, common.CreateHttpNamespace)
160+
if err != nil {
161+
return "", err
162+
}
163+
154164
output, err := sdApi.awsFacade.CreateHttpNamespace(ctx, &sd.CreateHttpNamespaceInput{
155165
Name: &nsName,
156166
})
@@ -163,6 +173,11 @@ func (sdApi *serviceDiscoveryApi) CreateHttpNamespace(ctx context.Context, nsNam
163173
}
164174

165175
func (sdApi *serviceDiscoveryApi) CreateService(ctx context.Context, namespace model.Namespace, svcName string) (svcId string, err error) {
176+
err = sdApi.rateLimiter.Wait(ctx, common.CreateService)
177+
if err != nil {
178+
return "", err
179+
}
180+
166181
var output *sd.CreateServiceOutput
167182
if namespace.Type == model.DnsPrivateNamespaceType {
168183
dnsConfig := sdApi.getDnsConfig()

pkg/common/ratelimiter.go

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,14 @@ import (
88
)
99

1010
const (
11-
ListNamespaces Event = "ListNamespaces"
12-
ListServices Event = "ListServices"
13-
GetOperation Event = "GetOperation"
14-
RegisterInstance Event = "RegisterInstance"
15-
DeregisterInstance Event = "DeregisterInstance"
11+
ListNamespaces Event = "ListNamespaces"
12+
ListServices Event = "ListServices"
13+
GetOperation Event = "GetOperation"
14+
DiscoverInstances Event = "DiscoverInstances"
15+
CreateHttpNamespace Event = "CreateHttpNamespace"
16+
CreateService Event = "CreateService"
17+
RegisterInstance Event = "RegisterInstance"
18+
DeregisterInstance Event = "DeregisterInstance"
1619
)
1720

1821
type Event string
@@ -26,11 +29,14 @@ func NewDefaultRateLimiter() RateLimiter {
2629
return RateLimiter{rateLimiters: map[Event]*rate.Limiter{
2730
// Below are the default limits for the AWS CloudMap's APIs
2831
// TODO: make it customizable in the future
29-
ListNamespaces: rate.NewLimiter(rate.Limit(1), 5), // 1 ListNamespaces API calls per second
30-
ListServices: rate.NewLimiter(rate.Limit(2), 10), // 2 ListServices API calls per second
31-
GetOperation: rate.NewLimiter(rate.Limit(100), 200), // 100 GetOperation API calls per second
32-
RegisterInstance: rate.NewLimiter(rate.Limit(50), 100), // 50 RegisterInstance API calls per second
33-
DeregisterInstance: rate.NewLimiter(rate.Limit(50), 100), // 50 DeregisterInstance API calls per second
32+
ListNamespaces: rate.NewLimiter(rate.Limit(0.5), 5), // 1 ListNamespaces API calls per second
33+
ListServices: rate.NewLimiter(rate.Limit(2), 10), // 2 ListServices API calls per second
34+
GetOperation: rate.NewLimiter(rate.Limit(100), 200), // 100 GetOperation API calls per second
35+
DiscoverInstances: rate.NewLimiter(rate.Limit(500), 1000), // 500 DiscoverInstances API calls per second
36+
CreateHttpNamespace: rate.NewLimiter(rate.Limit(0.5), 5), // 1 CreateHttpNamespace API calls per second
37+
CreateService: rate.NewLimiter(rate.Limit(5), 50), // 5 CreateService API calls per second
38+
RegisterInstance: rate.NewLimiter(rate.Limit(50), 100), // 50 RegisterInstance API calls per second
39+
DeregisterInstance: rate.NewLimiter(rate.Limit(50), 100), // 50 DeregisterInstance API calls per second
3440
}}
3541
}
3642

0 commit comments

Comments
 (0)