2012-01-03 4 views
5

Я хотел бы реализовать хороший алгоритм дросселя в .net (C# или VB), но я не могу понять, как я могу это сделать..NET Throttle algorithm

Дело в том, что мой сайт asp.net должен отправлять запросы на другой сайт для получения результатов. Должно быть отправлено максимум 300 запросов в минуту.

Если запрос превышает предел 300, другая сторона Api ничего не возвращает (это то, что я бы не хотел использовать в качестве чека в моем коде).

P.S. Я видел решения на других языках, кроме .net, но я новичок и, пожалуйста, будьте добры и сохранить ваши ответы так просто, как 123.

Спасибо

+1

Возможный дубликат [Астрономические задачи дросселирования] (http://stackoverflow.com/questions/22492383/throttling-asynchronous-tasks) –

ответ

5

Вы могли бы иметь простое приложение (или сеанс) класса и проверьте, что для хитов. Это что-то очень грубое просто чтобы дать вам идею:

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

Самый простой подход, это просто время, как долго он находится между пакетами и не позволяют им быть отправлены в размере более чем через каждые 0,2 секунды. То есть, записывайте время, когда вы вызываетесь, и когда вы будете затем вызваны, проверьте, чтобы по крайней мере 200 мс выровнялись или ничего не возвращали.

Этот подход будет работать, но он будет работать только для плавных потоков пакетов - если вы ожидаете всплески активности, тогда вы можете разрешить 5 сообщений за любой период в 200 мкс, если в среднем за 1 минуту не более 300 звонки. В этом случае вы можете использовать массив значений для хранения «временных меток» из последних 300 пакетов, а затем каждый раз, когда yoiu получает вызов, вы можете оглянуться назад на «300 звонков назад», чтобы проверить, прошло ли как минимум 1 минута ,

Для обеих этих схем значения времени, возвращаемые Environment.TickCount, будут адекватны вашим потребностям (не менее 200 миллисекунд), так как они точны примерно до 15 мс.