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

cache the exceeded window using an expiration timestamp thus making reloaded_limit_exceeded? private #27

Draft
wants to merge 1 commit into
base: master
Choose a base branch
from

Conversation

dhruvCW
Copy link
Contributor

@dhruvCW dhruvCW commented Oct 5, 2022

Description

PR Description goes here!

PR Contains:

  • Documentation
  • Tests
  • Breaking Changes

Related Issues

  • ...

TODO

  • ...

Changelog

Added

  • ...

Changed

  • ...

Deprecated

  • ...

Removed

  • ...

Fixed

  • ...

Security

  • ...

@dhruvCW dhruvCW changed the title wip cache the exceeded window using an expiration timestamp thus making reloaded_limit_exceeded? private cache the exceeded window using an expiration timestamp thus making reloaded_limit_exceeded? private Oct 5, 2022
@exceeded_window = Window.find_exceeded(windows)
return if @exceeded_window.nil?

@exceeded_window_expires_at = Time.now + @exceeded_window.interval
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Since this is a Window related logic.. would it be better if we expose Window#expires_at method?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

it's kind of difficult for me to decide, since a window doesn't know it has exceeded and thus the cooldown period (expires_at) will always be now + interval.

does this make sense in your design ? if yes I can indeed change it.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

window know the interval, right?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yup that's where I get the it right now.

Copy link
Contributor

@aka-momo aka-momo Oct 5, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Aha.. I get your point now 👍

What if user initializes another Worker instance in 30 seconds (while the remaining time the window is 10 seconds at that time) ?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

IMO the current issue is Window doesn't know it's exceeded until checked. we could set the expiration timestamp at the moment of checking, which should be okay IMO though then the quest is how do we clear the timestamp.

Copy link
Contributor

@aka-momo aka-momo Oct 5, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

we could set the expiration timestamp at the moment of checking

I believe if want to get an accurate timestamp, we need to get if from redis. Because at the moment of checking does not guarantee the accuracy

Example

Window: 1 request per day
interval: 86400
threshold: 1

If we check the limit exceeded 1 hour before the end of the day. it would gives us 24 hours + Time.now
Which in fact should be 1 hours + Time.now

Comment on lines 27 to 31
def limit_exceeded?
reload_limit_exceeded if exceeded_window.nil? || exceeded_window_expires_at >= Time.current

exceeded_window.present?
end
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This makes sense now, since limit_exceeded? is being called only once during the throttle cycle 👍

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

Successfully merging this pull request may close these issues.

2 participants