나는 좋은 스로틀 알고리즘을 구현하고 싶습니다. NET (C #또는 VB)하지만 어떻게 할 수 알아낼 수 없습니다.
이 사건은 내 asp.net 웹 사이트가 결과를 가져 오기 위해 다른 웹 사이트에 요청을 게시해야합니다. 분당 최대 300 건의 요청을 보내야합니다.
요청이 300 제한을 초과하면 상대방 Api는 아무 것도 반환하지 않습니다 (어떤 코드가 내 코드에서 수표로 사용하고 싶지 않습니다).
추신 .net 이외의 다른 언어로 된 솔루션을 보았습니다. 그러나 나는 초보자이며 예의 바르고 123로 답을 간략하게 유지하십시오.
고맙습니다
당신은 간단한 어플리케이션 (또는 세션) 클래스를 가질 수 있고 히트를 체크 할 수 있습니다. 이것은 당신에게 아이디어를주기 위해 매우 거친 것입니다.
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;
}
}
}
}
가장 간단한 방법은 패킷 간 간격을 0.2 초마다 하나 이상의 속도로 전송하지 못하게하는 것입니다. 즉, 전화를 받았을 때와 다음에 전화 할 때를 기록하고 적어도 200ms가 지나쳤는지 확인하거나 아무것도 반환하지 않는지 확인하십시오.
이 접근법은 효과가 있지만 부드러운 패킷 흐름에서만 작동합니다. 활동이 급증 할 경우 1 분이 넘는 평균값이 300 회를 넘지 않는 한 200ms 동안 5 개의 메시지를 허용 할 수 있습니다. 이 경우 값 배열을 사용하여 마지막 300 패킷의 "타임 스탬프"를 저장 한 다음 yoiu가 전화를받을 때마다 "300 calls ago"로 돌아가서 적어도 1 분이 경과했는지 확인할 수 있습니다 .
이 두 가지 방법 모두에 의해 반환 된 시간 값Environment.TickCount
귀하의 요구에 적합 할 것입니다 (200 밀리 초 이상). 정확하기 때문에 약 15 밀리 초입니다.