Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Multiple limits on the same instance (max per min and max per sec) #55

Open
Darkbound opened this issue May 21, 2022 · 3 comments
Open

Comments

@Darkbound
Copy link

Darkbound commented May 21, 2022

I am working with several APIs on my app and a few of them have limits that are not just simply per sec.
For example one of my apis has the following limits:

  • Max 100 requests per 2 minutes
  • Max 20 requests per 1 second

So I have tried implementing it the following way:

axiosRateLimit(baseAxios.create(), {
  maxRequests: 1, // 1
  perMilliseconds: 1200 // per 1.2 seconds
  // 100 requests per 2 minutes, 50 requests per 60 seconds, 60 seconds / 50 requests = 1 per 1.2 seconds
});

But it can't take advantage of the 20 requests per 1 second limit, because to adhere to the 100 requests per 2 minutes, I have to limit it to 1 per 1.2 seconds, otherwise if I limit it to 20 per second, I can do 2400 requests in 2 minutes.

So how can I implement both conditions and have them both working together?
What if I need to do only 50 requests every 2 minutes, with the current implementation, it will take me 1 minute for all of them, and I am not taking advantage of the 20 per second (becaus if I do, I can do it in 3 seconds, instead of 1 minute).

Is there a way to accomplish this with this library? Initially I thought that the maxRequests works with perMilliseconds and maxRPS can be used to handle the other case, so when all 3 are supplied I thought it would be like:

{
  maxRequests: 100, // 100 max requests
  perMilliseconds: 2 * 60 * 1000, // per 2 minutes
  maxRPS: 20 // 20 max per second
}

But the docs say:

// sets max 2 requests per 1 second, other will be delayed
// note maxRPS is a shorthand for perMilliseconds: 1000, and it takes precedence
// if specified both with maxRequests and perMilliseconds
const http = rateLimit(axios.create(), { maxRequests: 2, perMilliseconds: 1000, maxRPS: 2 })

So obviously it doesnt work the way I expected it to work, is there a way to achieve what I want?

@adbutterfield
Copy link

I have the same issue right now too!

@WSeubring
Copy link

You could nest the ratelimited Instance.

const axiosInstance = rateLimit(rateLimit(axios.create(), { maxRequests: 10, perMilliseconds: 5000 }), {
  maxRequests: 20,
  perMilliseconds: 100000,
});

@rombat
Copy link

rombat commented Apr 22, 2024

You could nest the ratelimited Instance.

const axiosInstance = rateLimit(rateLimit(axios.create(), { maxRequests: 10, perMilliseconds: 5000 }), {
  maxRequests: 20,
  perMilliseconds: 100000,
});

Is this actually working?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants