A bucket-wise quota service.
You should use the included Dockerfile (and images generated by it) to run this application.
The following environment variables must be set:
REDIS_URIshould point to a Redis instance, for example:redis://redis-instance. At least version 7.0 is required.CONFIG_FILE_PATHshould be the path to an accessible TOML config file, for example:/app/config.tomlLISTEN_IPshould be set to the IP address of the interface to listen for connections on, for example0.0.0.0to listen on all interfaces.LISTEN_PORTshould be set to an available TCP port to listen for connections on, for example8080
The application will expose an HTTP service at <LISTEN_IP>:<LISTEN_PORT>.
The configuration file should describe the quota limits for each bucket.
The following example config file will allow:
- the
bkt::test-client::globalbucket to be charged 15 times per hour. - the
bkt::test-client::service-a::readbucket to be charged 50 times per day. - the
bkt::other-client::globalbucket to be charged 1250 times per month.
[[limits]]
bucket = "bkt::test-client::global"
type = "hourly"
freq = 15
[[limits]]
bucket = "bkt::test-client::service-a::read"
type = "daily"
freq = 50
[[limits]]
bucket = "bkt::other-client::global"
type = "monthly"
freq = 1250The available types are secondly, minutely, hourly, daily, weekly, and monthly.
Note that a monthly quota period is always exactly 30 days.
The service exposes the following route:
POST /api/v1/buckets/:bucket_id/charges
where :bucket_id is replaced with the name of a bucket.
An application/json payload is expected with a charge, for example:
{
"amount": 3
}A bucket may only be charged at most 1000 units at a time.
The application will respond with one of the following string JSON string payloads:
okmeans the charges were applied and there is still available quota in each bucket.slow_downmeans the charges were applied, and there is still available quota in each bucket, but at least one bucket is over 90% full for the current period.stopmeans the bucket is already full for the current period. The bucket will be blocked for a few seconds to throttle the owner.blockmeans a request for a bucket is being made after the owner was already warned tostop. The bucket is blocked for (at least) one minute.