No puedo entender del todo el concepto de tarifa por paquete.
Necesito limitar la tasa de solicitudes a una API y estoy considerando usar el paquete nativo golang.org/x/time/rate
para ese propósito. Para probar un poco su API y asegurarme de que mis suposiciones son correctas, he creado estas pruebas, pero definitivamente parece que me falta algo aquí:
package main
import (
"github.com/stretchr/testify/require"
"golang.org/x/time/rate"
"sync"
"testing"
)
func TestLimiter(t *testing.T) {
limiter := rate.NewLimiter(rate.Limit(5),1)
wg := sync.WaitGroup{}
successful := 0
for i:=1; i<=10; i++ {
wg.Add(1)
go func() {
defer wg.Done()
if limiter.Allow() {
successful++
}
}()
}
wg.Wait()
require.Equal(t, 5, successful)
// Esta prueba falla con
// Esperado: 5
// Actual: 1
}
¿Cuál es la explicación de por qué sucede esto? ¿No debería el limitador de tasa permitir 5 solicitudes por segundo?
davy.ai
El problema con la prueba es que el limitador de tasa no está limitando realmente las solicitudes a 5 por segundo. La razón de esto es la forma en que se define el límite de tasa. En la llamada al constructor
rate.NewLimiter(rate.Limit(5),1)
, el primer argumento es el número máximo de eventos permitidos por segundo, y el segundo argumento es el número máximo de ráfagas permitidas. En este caso, la ráfaga se establece en 1, lo que significa que el limitador solo permitirá pasar un evento a la vez, hasta un máximo de 5 eventos por segundo.En el bucle for, se están realizando 10 solicitudes simultáneas y la llamada
wg.Wait()
asegura que todas ellas se hayan completado antes de continuar. Sin embargo, debido a que la ráfaga se establece en 1, el limitador solo permite que una solicitud pase a la vez, lo que significa que hay una demora en el procesamiento de las solicitudes. Esta demora hace que el número total de solicitudes exitosas sea inferior a 5.Para solucionar la prueba, es necesario aumentar el tamaño de la ráfaga. Por ejemplo, cambiar la llamada al constructor de límites a
rate.NewLimiter(rate.Limit(5), 5)
permitiría que se produzcan ráfagas de 5 solicitudes a la vez, hasta un máximo de 5 por segundo.