Change to Token Bucket rate limiting. Change defer semantics since Block() isn't in a hot path. #45
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 an example implementation to address #6. For the moment, it uses the Token Bucket Algorithm to provide rate limiting on a time interval basis with an initial and total capacity (for requests) of 1.
If the solution is agreeable, it's also possible to easily extend this and allow the user more advanced rate limiting with command line arguments for initial and total request capacity which would equate to how many requests a host starts with up front, how many requests can be accumulated in the bucket, etc.
For now, I left the implementation static at an initial and total capacity of 1.
I also changed
Block()
todefer r.Unlock()
instead of having multiple called to unlock the map. Whiledefer
is currently slow, that shouldn't be a limiting factor inBlock()
as the code will probably be limited by network latency.