HammerBackendEredisCluster
A clustered-Redis backend for the Hammer rate-limiter (Hammer v7+), built on eredis_cluster.
Keys embed a {hash tag} so every window of a key maps to the same cluster
slot — the reason to pick this over the single-node official
hammer-backend-redis.
Installation
Add hammer_backend_eredis_cluster to your list of dependencies in mix.exs:
def deps do
[
{:hammer_backend_eredis_cluster, "~> 2.0"},
{:hammer, "~> 7.0"}
]
end
2.0.0 is also mirrored in the
loopsocialorg repo (hexpm:loopsocial), where it was first published while public package ownership was being restored — consumers pinned there can stay or drop theorganization:option at their leisure.
Using Hammer 6? Stay on {:hammer_backend_eredis_cluster, "~> 1.0"} — 2.0 is
the Hammer 7 port and drops the v6 Hammer.Backend behaviour (see the
CHANGELOG).
Usage
Define a rate limiter and start it (typically under your supervision tree):
defmodule MyApp.RateLimit do
use Hammer, backend: Hammer.EredisCluster
end
# The cluster connection is managed elsewhere
# (e.g. `config :eredis_cluster, init_nodes: [...]`):
MyApp.RateLimit.start_link([])
# Or let the limiter establish the connection:
MyApp.RateLimit.start_link(
servers: [{"127.0.0.1", 7001}, {"127.0.0.1", 7002}],
options: [username: "myuser", password: "mypassword"]
)
# Allow 10 requests per minute:
case MyApp.RateLimit.hit("user_123", :timer.minutes(1), 10) do
{:allow, _count} -> :ok
{:deny, retry_ms} -> {:error, {:rate_limited, retry_ms}}
end
use Hammer, backend: Hammer.EredisCluster accepts :cluster (eredis_cluster
name, default :eredis_cluster_default), :prefix (Redis key prefix, default:
the module name) and :algorithm (only :fix_window). See the
Hammer.EredisCluster module docs.
Documentation
On hexdocs: https://hexdocs.pm/hammer_backend_eredis_cluster/
Run tests locally
Tests need a real Redis cluster. Either docker-compose up -d (see
docker-compose.yml) and run tests with
REDIS_CLUSTER_NODES=redis-master-1:6379,redis-master-2:6379,redis-master-3:6379,
or start three local cluster-mode nodes on ports 7001-7003 (the default
REDIS_CLUSTER_NODES):
for p in 7001 7002 7003; do
redis-server --port $p --cluster-enabled yes --cluster-config-file /tmp/rc/node-$p.conf \
--dir /tmp/rc --daemonize yes --save "" --appendonly no
done
redis-cli --cluster create 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 \
--cluster-replicas 0 --cluster-yes
mix test
Getting Help
If you're having trouble, open an issue on this repo.