es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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?

Tags:  ,

Answer

  1. Avatar for 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.

Comments are closed.