WeaveScope

BeamWeaver Rate Limiting

BeamWeaver rate limiting bounds model and tool work before the runtime starts supervised tasks.

The first implementation is an in-memory token bucket:

{:ok, limiter} =
  BeamWeaver.RateLimiter.start_bucket(
    capacity: 10,
    refill_amount: 10,
    refill_interval: 1_000
  )

:ok = BeamWeaver.RateLimiter.acquire(limiter, 1, timeout: 5_000)

Callers can wait, reject immediately, or drop immediately:

BeamWeaver.RateLimiter.acquire(limiter, 1, mode: :wait, timeout: 5_000)
BeamWeaver.RateLimiter.acquire(limiter, 1, mode: :reject)
BeamWeaver.RateLimiter.acquire(limiter, 1, mode: :drop)

Failures are tagged tuples:

{:error, %BeamWeaver.RateLimiter.Error{type: :timeout}}
{:error, %BeamWeaver.RateLimiter.Error{type: :rate_limited}}

Queued callers are monitored. If waiting work is canceled, it is removed from the queue and does not consume future refill capacity.