View Source Nostrum.Api.RatelimiterGroup (Nostrum v0.10.0)
Tracks ratelimiters and determines correct ratelimiters to use per request.
Purpose
In a multi-node setup, users want to be able to make API requests from any node in the cluster without having to worry about hitting ratelimits. This module serves as the mediator between API clients on any nodes and their target ratelimiter.
Internal module
This module is intended for exclusive usage inside of nostrum, and is documented for completeness and people curious to look behind the covers.
Approach
A naive implementation might simply forward requests to the locally (on the same node) running ratelimiter. However, this falls short when modules on other nodes want to make API requests, as they then effectively begin tracking their own ratelimit state, rendering it inconsistent.
Instead, the approach is that we have a locally running ratelimiter on each
node, all of which are registered via the :pg
process group managed by this
module. When an API request comes in, we determine its ratelimit bucket (see
Nostrum.Api.Ratelimiter.get_endpoint/2
) and based on that, determine the
target ratelimiter by selecting it from the list of known ratelimiters via
:erlang.phash2/2
.
Summary
Functions
Join the given ratelimiter to the group.
Return a ratelimiter PID to use for requests to the given ratelimiter bucket
.
Functions
@spec join(pid()) :: :ok
Join the given ratelimiter to the group.
Return a ratelimiter PID to use for requests to the given ratelimiter bucket
.