5

나는 좋은 스로틀 알고리즘을 구현하고 싶습니다. NET (C #또는 VB)하지만 어떻게 할 수 알아낼 수 없습니다.

이 사건은 내 asp.net 웹 사이트가 결과를 가져 오기 위해 다른 웹 사이트에 요청을 게시해야합니다. 분당 최대 300 건의 요청을 보내야합니다.

요청이 300 제한을 초과하면 상대방 Api는 아무 것도 반환하지 않습니다 (어떤 코드가 내 코드에서 수표로 사용하고 싶지 않습니다).

추신 .net 이외의 다른 언어로 된 솔루션을 보았습니다. 그러나 나는 초보자이며 예의 바르고 123로 답을 간략하게 유지하십시오.

고맙습니다


2 답변


6

당신은 간단한 어플리케이션 (또는 세션) 클래스를 가질 수 있고 히트를 체크 할 수 있습니다. 이것은 당신에게 아이디어를주기 위해 매우 거친 것입니다.

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 초마다 하나 이상의 속도로 전송하지 못하게하는 것입니다. 즉, 전화를 받았을 때와 다음에 전화 할 때를 기록하고 적어도 200ms가 지나쳤는지 확인하거나 아무것도 반환하지 않는지 확인하십시오.

이 접근법은 효과가 있지만 부드러운 패킷 흐름에서만 작동합니다. 활동이 급증 할 경우 1 분이 넘는 평균값이 300 회를 넘지 않는 한 200ms 동안 5 개의 메시지를 허용 할 수 있습니다. 이 경우 값 배열을 사용하여 마지막 300 패킷의 "타임 스탬프"를 저장 한 다음 yoiu가 전화를받을 때마다 "300 calls ago"로 돌아가서 적어도 1 분이 경과했는지 확인할 수 있습니다 .

이 두 가지 방법 모두에 의해 반환 된 시간 값Environment.TickCount귀하의 요구에 적합 할 것입니다 (200 밀리 초 이상). 정확하기 때문에 약 15 밀리 초입니다.

연결된 질문


관련된 질문

최근 질문