0Pricing
Go Academy · Lección

golang.org/x/time/rate

Use el limitador de tasa

golang.org/x/time/rate es una lección gratuita de Go Academy en CoddyKit. Esta es la lección 2 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Go Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Go Academy incluye 4 lecciones en total.

El paquete rate

golang.org/x/time/rate proporciona un Limiter de producción basado en un cubo de tokens. Es la opción estándar para limitar la tasa en Go.

  • Implementación probada en producción
  • Métodos Allow, Wait y Reserve
  • Compatible con contextos

Crear un Limiter

rate.NewLimiter recibe una tasa (tokens por segundo) y un tamaño de ráfaga. rate.Limit es un float64 de eventos por segundo.

limiter := rate.NewLimiter(rate.Limit(10), 5)

rate.Every

Si piensa en intervalos en lugar de tasas por segundo, rate.Every convierte una duración en una tasa. Un evento cada 200 ms equivale a cinco por segundo.

limiter := rate.NewLimiter(rate.Every(200*time.Millisecond), 1)

Allow

Allow indica si hay un token disponible en este momento. Devuelve true y consume un token, o devuelve false inmediatamente. Úselo para rechazar las solicitudes que superen el límite.

if !limiter.Allow() {
    fmt.Println("rejected: too many requests")
    return
}

Wait

Wait se bloquea hasta que haya un token disponible o se cancele el contexto. Es ideal cuando quiere espaciar el trabajo en lugar de descartarlo.

if err := limiter.Wait(ctx); err != nil {
    return err
}
doWork()

Reserve

Reserve devuelve una Reservation que indica cuánto tiempo se debe esperar. Llame a Delay() para conocer la espera y a Cancel() si decide no continuar.

r := limiter.Reserve()
if !r.OK() {
    return
}
time.Sleep(r.Delay())

Nota: paquete externo

El paquete rate no forma parte de la biblioteca estándar, por lo que requiere go get golang.org/x/time/rate y un módulo. Los fragmentos que lo importan son ilustrativos y no se ejecutan aquí directamente.

Un equivalente ejecutable de la biblioteca estándar

Como el paquete rate es externo, aquí tiene un bucle de control de ritmo de la biblioteca estándar que imita Wait haciendo tick cada 200 ms.

package main

import (
    "fmt"
    "time"
)

func main() {
    tick := time.NewTicker(200 * time.Millisecond)
    defer tick.Stop()
    for i := 0; i < 4; i++ {
        <-tick.C
        fmt.Println("processed event", i)
    }
}

Ajustar en tiempo de ejecución

Puede cambiar los límites sobre la marcha con SetLimit y SetBurst. Esto resulta útil cuando una recarga de configuración o una respuesta 429 del servicio ascendente le indica que debe reducir el ritmo.

limiter.SetLimit(rate.Limit(20))
limiter.SetBurst(10)

Limitadores por cliente

Mantenga un mapa de claves de cliente a *rate.Limiter, protegido por un mutex. Cree un limitador en la primera solicitud para esa clave y reutilícelo en las solicitudes posteriores.

func getLimiter(m map[string]*rate.Limiter, key string) *rate.Limiter {
    if l, ok := m[key]; ok {
        return l
    }
    l := rate.NewLimiter(rate.Limit(5), 10)
    m[key] = l
    return l
}

Middleware HTTP

Envuelva los handlers para que cada solicitud llame primero a Allow(). Si devuelve false, responda con HTTP 429 Too Many Requests. Este es el límite de tasa canónico del lado del servidor.

Comprobación rápida

Compruebe sus conocimientos sobre el paquete rate.

Repaso

Ha aprendido a usar golang.org/x/time/rate:

  • NewLimiter(rate, burst) crea el bucket
  • rate.Every convierte un intervalo en una tasa
  • Allow rechaza, Wait regula el ritmo y Reserve informa del retraso
  • SetLimit y SetBurst permiten ajustar la configuración en tiempo de ejecución
  • Un mapa por cliente y HTTP 429 para servidores

Preguntas frecuentes

¿La lección «golang.org/x/time/rate» es gratis?

Sí — el texto completo de «golang.org/x/time/rate» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Go Academy, actualiza a CoddyKit PRO. El curso de Go Academy incluye 4 lecciones en total.

¿Qué aprenderé en «golang.org/x/time/rate»?

Use el limitador de tasa Practicas Go Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar Go Academy?

No se requiere experiencia previa. Go Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 2 de 4.

¿Cuánto tiempo toma la lección «golang.org/x/time/rate»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de Go Academy?

Sí. Cada lección de Go Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Concepto del token bucket
  2. golang.org/x/time/rate
  3. Limitación de goroutines
  4. Retirada progresiva y reintento
← Volver a Go Academy