- Sponsor
-
Notifications
You must be signed in to change notification settings - Fork 34
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
RedisStore is required with each limiter #171
Comments
express-rate-limit/express-rate-limit#364 should help reduce the confusion here. It will make it log an error if the first request is counted more than once with the same store/key/prefix. The error will have a link to https://express-rate-limit.github.io/ERR_ERL_DOUBLE_COUNT/ where we can put a bit of additional information. |
I'm sorry if the question sounds silly, but I'm gonna ask this anyway. I understand that it is not a good practice to use same store for multiple rate limiter instances, but what happens when I am running multiple instances of my application for scaling reasons? Can they not share the same redis instance (the same prefix)? If not, how can rate limits be counted without reset if say the http requests were routed to different instances of my application in a round robin fashion? @Zirafnik @nfriedly |
Sorry @shrihari-prakash , I think the word "instances" makes this more confusing.
Does that make more sense? Another way to put it is that each time you write |
@nfriedly that makes perfect sense :). I was more concerned about scenario 1 that you mentioned.
in this page raised a concern because it does not mention if it is inside the same process or across different processes. Thank you for clarifying. It would also be fantastic if the docs reflected that as well! |
Description
This not an bug, but just an issue I faced, which will hopefully save somebody hours of work.
For most this is probably already obvious, but you need to create a new
RedisStore
for each limiter.You cannot define a
RedisStore
and then re-use it accross all limiters. This does NOT work:It doesn't work, because
RedisStore
reads thewindowMs
property when initializing, and uses it to setreset-timer
. Without it, thereset-timer
is set by default to 24 hours. Additionally, in the above example theRedisStore
would always use the same keyprefix
, which means that different API routes would count towards the same limit.So in short, you always need to create a new
RedisStore
with each limiter.EXTRA
You can extract the
sendCommand
function to re-use it across all newRedisStores
.The text was updated successfully, but these errors were encountered: