4
4
"context"
5
5
"errors"
6
6
"fmt"
7
+ "time"
8
+
9
+ "golang.org/x/time/rate"
7
10
8
11
"github.com/aws/aws-cloud-map-mcs-controller-for-k8s/pkg/common"
9
12
"github.com/aws/aws-cloud-map-mcs-controller-for-k8s/pkg/model"
@@ -52,19 +55,30 @@ type ServiceDiscoveryApi interface {
52
55
}
53
56
54
57
type serviceDiscoveryApi struct {
55
- log common.Logger
56
- awsFacade AwsFacade
58
+ log common.Logger
59
+ awsFacade AwsFacade
60
+ nsRateLimiter * rate.Limiter
61
+ svcRateLimiter * rate.Limiter
62
+ opRateLimiter * rate.Limiter
57
63
}
58
64
59
65
// NewServiceDiscoveryApiFromConfig creates a new AWS Cloud Map API connection manager from an AWS client config.
60
66
func NewServiceDiscoveryApiFromConfig (cfg * aws.Config ) ServiceDiscoveryApi {
61
67
return & serviceDiscoveryApi {
62
- log : common .NewLogger ("cloudmap" ),
63
- awsFacade : NewAwsFacadeFromConfig (cfg ),
68
+ log : common .NewLogger ("cloudmap" , "api" ),
69
+ awsFacade : NewAwsFacadeFromConfig (cfg ),
70
+ nsRateLimiter : rate .NewLimiter (rate .Every (1 * time .Second ), 5 ), // 1 per second
71
+ svcRateLimiter : rate .NewLimiter (rate .Every (2 * time .Second ), 10 ), // 2 per second
72
+ opRateLimiter : rate .NewLimiter (rate .Every (100 * time .Second ), 200 ), // 100 per second
64
73
}
65
74
}
66
75
67
76
func (sdApi * serviceDiscoveryApi ) GetNamespaceMap (ctx context.Context ) (map [string ]* model.Namespace , error ) {
77
+ err := sdApi .nsRateLimiter .Wait (ctx )
78
+ if err != nil {
79
+ return nil , err
80
+ }
81
+
68
82
namespaceMap := make (map [string ]* model.Namespace )
69
83
70
84
pages := sd .NewListNamespacesPaginator (sdApi .awsFacade , & sd.ListNamespacesInput {})
@@ -91,6 +105,11 @@ func (sdApi *serviceDiscoveryApi) GetNamespaceMap(ctx context.Context) (map[stri
91
105
}
92
106
93
107
func (sdApi * serviceDiscoveryApi ) GetServiceIdMap (ctx context.Context , nsId string ) (map [string ]string , error ) {
108
+ err := sdApi .svcRateLimiter .Wait (ctx )
109
+ if err != nil {
110
+ return nil , err
111
+ }
112
+
94
113
serviceIdMap := make (map [string ]string )
95
114
96
115
filter := types.ServiceFilter {
@@ -155,6 +174,11 @@ func (sdApi *serviceDiscoveryApi) ListOperations(ctx context.Context, opFilters
155
174
}
156
175
157
176
func (sdApi * serviceDiscoveryApi ) GetOperation (ctx context.Context , opId string ) (operation * types.Operation , err error ) {
177
+ err = sdApi .opRateLimiter .Wait (ctx )
178
+ if err != nil {
179
+ return nil , err
180
+ }
181
+
158
182
opResp , err := sdApi .awsFacade .GetOperation (ctx , & sd.GetOperationInput {OperationId : & opId })
159
183
160
184
if err != nil {
0 commit comments