---
name: RateLimiter
lang: go
domain: infra
version: "1.0.0"
algebraic: product
definition: |
  type RateLimiter struct {
      rate    float64
      burst   int
      mu      sync.Mutex
      clients map[string]*rateLimiterClient
  }
description: "Token-bucket rate limiter in-memory. Mantiene un bucket por clave (IP o custom) con tokens recargados a tasa constante. Protegido por mutex para uso concurrente."
tags: [rate_limit, http, middleware, token_bucket, infra]
uses_types: []
file_path: "functions/infra/rate_limiter.go"
---

## Ejemplo

```go
// 10 req/s con rafagas hasta 20
rl := RateLimiterNew(10, 20)
result := RateLimiterCheck(rl, "192.168.1.1")
if !result.Allowed {
    // rechazar request
}
```

## Notas

Tipo producto con estado mutable (mapa de clientes). Los campos son privados — se accede via `RateLimiterNew`, `RateLimiterCheck`, `RateLimiterCleanup`. El bucket se llena a `rate` tokens/segundo hasta un maximo de `burst`. Cada request consume 1 token. Sin GC explicito (`RateLimiterCleanup`) los buckets crecen indefinidamente con cada IP unica vista.
