2011-10-13 4 views
1

MVC.Net 응용 프로그램을 만들었으며 사용자가 약 5MB 크기의 설치 파일을 다운로드 할 수있는 다운로드 페이지가 있습니다. 이 설정 파일은 우리가 다운로드 버튼을 누르면 동적으로 생성됩니다. 이 설정 파일의 동적 생성마다 서버 CPU 사용량의 7 %가 증가합니다. 사용자 수가 100 명 이상 증가하고 모두 파일을 다운로드하려고하면 CPU 사용량이 100 %로 증가하여 서버가 다운되거나 응답이 없어집니다.요청 수에 대한 동시 파일 다운로드 수를 제한하는 방법은 무엇입니까?

이 상황을 극복하기 위해 우리는 코드별로 총 5 개의 다운로드를 논리적으로 제한하려고합니다. 즉, 5 명의 사용자가 한 번에 파일을 다운로드 할 수 있고 6 번째 이후에는 처음 5 번의 다운로드가 완료되지 않을 때까지 대기열에 있습니다. 대기열에있는 사용자에게 "다운로드가 28 초 후에 시작됩니다"정도의 대기 시간을 표시해야합니다.

제안 사항을 달성하는 방법에 대해 매우 높이 평가할 것입니다.

감사합니다, Haidar

+0

얼마나 많은 다른 버전의 설정이있을 수 있습니까? 항상 동적으로 생성해야합니까? – Kasaku

+0

버전은 각 사용자마다 다르며 동적으로 생성해야합니다. – Haidar

+2

비동기 메서드 또는 이러한 파일 배포 대기열 서비스를 등록 할 수 없습니다 - 준비가되었을 때 사용자에게 전자 메일 링크를 보내 파일을 다운로드 하시겠습니까? 24-48 시간 후에 생성 된 파일을 삭제하는 서비스가있을 수 있다고 상상해보십시오. – Tommy

답변

1

당신은 당신이 정적 클래스의 Semaphore을 mantain 및 컨트롤러에 의해 액세스 할 수있는 Semaphore 사용하고 5로 제한 할 수 있습니다. 여기에 예를

:

public static class MySemaphore { 
    private static Semaphore pool = new Semaphore(0,5); 
    public Semaphore GetSemaphore() { return pool; } 
} 

public class MyController : Controller { 
    public ActionResult MyDownloadAction() { 
    MySemaphore.GetSemaphore().WaitOne(); // wait for semaphore 
    // do your job : create file 
    // ... 
    MySemaphore.GetSemaphore().Release(); // release the semaphore 
    // prepare download resource and send response 
    // ... 
    return View(); 
    } 

}

+0

이것을 달성 할 수있는 코드의 예가 있습니까? – Haidar

+0

@Haidar 내 편집 된 응답보기 –

+0

5 개의 요청이 처리되면 6 번째 요청이 차단되어 클라이언트가 시간 초과 될 수 있습니다. 의미 상 올바르지 만 질문에 설명 된 사용자 경험이 다릅니다. – Atacan

0

당신이 설명하는 동작은 액션에서 반환 이후 AJAX와 요청 상태를 추적 할 수 있어야합니다.

간단히 말해서 요청이 들어 오면 파일 결과를 반환하는 대신 티켓을 발급하고 사용자에게 대기 할 것을 알리는 페이지를 반환합니다.

사용자에게 반환 된 티켓은 쿠키 또는 페이지 자체에있을 수 있습니다. 가치가있는 한 GUID를 사용할 수 있습니다.

페이지가 AJAX로 서버를 n 초마다 폴링합니다. 이상적으로는이 폴링은 티켓이 제공 될 때까지 기다리는 사용자가 있다는 것을 알 수 있도록 서버 측의 티켓 (예 : 마지막으로 체크 한 타임 스탬프)을 업데이트해야합니다. 일단 용량을 확보하면 AJAX GET 결과 페이지 JS 코드 다운로드를 시작합니다.

티켓이 쿠키에없는 경우 티켓을 요청 URL에 추가 할 수 있습니다.

서버 측에서는 티켓을 확인하고 티켓이 유효하고 올바르게 주문되었는지 확인한 다음 파일을 제공하고 티켓을 제거합니다.

이제 구현 세부 사항은 보유하려는 서버의 수에 따라 달라집니다. 확장 가능한 시스템을 원한다면 Web Role/Worker Role/Queue of azure와 같은 것을 사용하는 것이 좋습니다. 이렇게하면 티켓 발급, 티켓 추적 및 티켓 처리가 분리됩니다.

개념 증명 시스템의 경우 티켓을 메모리에 보관하거나 작은 다중 기계 시스템의 경우 공유 데이터베이스를 가질 수 있습니다.

관련 문제