Move until_expired digests to separate zset #721
Merged
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
This is another potential solution to #684 . Although for our specific use case, we've moved away from sidekiq unique jobs for high traffic until_expired jobs, this may still be helpful for other users.
This is quite a large change, I appreciate I may need to improve my Lua, or make different refactorings.
In simple terms, the idea is to treat
until_expired
digests separately to the others. For all other digests, cleanup looks like this:But for
until_expired
, cleanup looks like this:For this reason, if you use a lot of
until_expired
jobs, the reaper can become very slow and expensive. My proposed solution here is:until_expired
digests with the others, put them in their own separate ZSET, where the value (score) is the expiry timeuntil_expired
ZSET based on the score, skip the other (expensive) reaping checks.