aishek / axios-rate-limit

Rate limit for axios
MIT License
237 stars 35 forks source link

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

Open Darkbound opened 2 years ago

Darkbound commented 2 years ago

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:

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 commented 1 year ago

I have the same issue right now too!

WSeubring commented 9 months ago

You could nest the ratelimited Instance.

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

You could nest the ratelimited Instance.

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

Is this actually working?