2012-01-03 22 views
5

Me gustaría implementar un buen algoritmo de aceleración en .net (C# o VB) pero no puedo entender cómo podría hacerlo..NET Throttle algorithm

El caso es que mi sitio web asp.net debe publicar solicitudes en otro sitio web para obtener resultados. Como máximo deben enviarse 300 solicitudes por minuto.

Si las solicitudes superan el límite de 300, la otra parte Api no devuelve nada (que es algo que no me gustaría utilizar como verificación en mi código).

P.S. He visto soluciones en otros idiomas aparte del .net pero soy un novato y por favor sea amable y mantener sus respuestas tan simple como 123.

Gracias

+1

Posible duplicado de [Reducción de tareas asíncronas] (http://stackoverflow.com/questions/22492383/throttling-asynchronous-tasks) –

Respuesta

5

Usted podría tener una aplicación sencilla (o sesión) clase y revisa eso para los golpes. Esto es algo extremadamente peligrosa sólo para darles la idea:

public class APIHits { 
    public int hits { get; private set; } 
    private DateTime minute = DateTime.Now(); 

    public bool AddHit() 
    { 
     if (hits < 300) { 
      hits++; 
      return true; 
     } 
     else 
     { 
      if (DateTime.Now() > minute.AddSeconds(60)) 
      { 
       //60 seconds later 
       minute = DateTime.Now(); 
       hits = 1; 
       return true; 
      } 
      else 
      { 
       return false; 
      } 
     } 
    } 
} 
2

El enfoque más simple es sólo para medir el tiempo que está entre los paquetes y no permite que sean enviados a un ritmo de más de uno cada 0,2 segundos. Es decir, registre la hora en que se le llama y la próxima vez que se llame, verifique que al menos 200 ms hayan sido eliminados o que no devuelva nada.

Este enfoque funcionará, pero solo funcionará para flujos de paquetes sin problemas: si espera ráfagas de actividad, puede permitir 5 mensajes en cualquier período de 200 ms, siempre que el promedio de 1 minuto no supere los 300 llamadas. En este caso, podría usar una matriz de valores para almacenar las "marcas de tiempo" de los últimos 300 paquetes, y luego, cada vez que reciba una llamada, puede consultar "300 llamadas atrás" para verificar que haya transcurrido al menos 1 minuto. .

Para estos dos esquemas, los valores de tiempo devueltos por Environment.TickCount serían adecuados para sus necesidades (intervalos de no menos de 200 milisegundos), ya que es preciso aproximadamente 15 ms.