feat: added limitting to the request rate.

This commit is contained in:
Andrey Parhomenko 2024-05-31 15:39:34 +05:00
parent f970498504
commit 4edffe94f3
4 changed files with 54 additions and 1 deletions

View file

@ -26,3 +26,4 @@ func NewClient(secretPath string) (*Client, error) {
}, nil }, nil
} }

View file

@ -11,6 +11,7 @@ const (
DefaultContentType = "application/json" DefaultContentType = "application/json"
DefaultAccept = DefaultContentType DefaultAccept = DefaultContentType
DefaultCacheControl = "no-cache" DefaultCacheControl = "no-cache"
MaxEntitiesPerRequest = 250
) )
type ClientOptions struct { type ClientOptions struct {
@ -34,6 +35,14 @@ type Client struct {
BaseURL *url.URL BaseURL *url.URL
secretStoreFilePath string secretStoreFilePath string
Debug bool Debug bool
availableRequests int
mrps int
ticker *time.Ticker
req chan struct{}
requestsMade int64
} }
type OAuthTokenResponse struct { type OAuthTokenResponse struct {
@ -112,3 +121,42 @@ func NewAPI(secretPath string) (*Client, error) {
return client, nil return client, nil
} }
// Set maximum requests per second.
func (client *Client) SetMRPS(rps int) *Client {
client.mrps = rps
client.req = make(chan struct{})
client.ticker = time.NewTicker(time.Second)
go func() {
for {
for _ = range make(
[]struct{},
client.mrps - client.availableRequests,
) {
client.req <- struct{}{}
}
client.availableRequests = client.mrps
<-client.ticker.C
}
}()
return client
}
func (client *Client) waitInQueue() bool {
// Just leaving if MRPS is not set.
if client.mrps == 0 {
return false
}
<- client.req
client.availableRequests--
return true
}
func (client *Client) finishRequest() {
}
func (client *Client) RequestsMade() int64 {
return client.requestsMade
}

View file

@ -22,6 +22,7 @@ func (client *Client) doRawRequest(
var ( var (
err error err error
) )
client.requestsMade++
reqBody := new(bytes.Buffer) reqBody := new(bytes.Buffer)
if params.Body != nil { if params.Body != nil {
@ -113,6 +114,9 @@ func (client *Client) doRequest(
err error err error
parsedURL *url.URL parsedURL *url.URL
) )
if client.waitInQueue() {
defer client.finishRequest()
}
parsedURL, err = url.Parse(u) parsedURL, err = url.Parse(u)
if err != nil { if err != nil {

View file

@ -7,7 +7,6 @@ import "encoding/json"
import "strconv" import "strconv"
import "log" import "log"
import "fmt" import "fmt"
//import "os"
var getLead = mtool.T("get-leads").Func(func(flags *mtool.Flags){ var getLead = mtool.T("get-leads").Func(func(flags *mtool.Flags){
var ( var (
@ -36,6 +35,7 @@ var getLead = mtool.T("get-leads").Func(func(flags *mtool.Flags){
if err != nil { if err != nil {
log.Fatalf("NewAmoClient(...): %s\n", err) log.Fatalf("NewAmoClient(...): %s\n", err)
} }
c.API.SetMRPS(8)
leads, err := c.GetLeads( leads, err := c.GetLeads(
urlenc.Array[int]{ urlenc.Array[int]{