클라이언트 (브라우저)가 최대 30 분 (또는 그 이상)이 소요되는 API 호출을 수행 할 수있는 ASP.NET MVC site을 구축하고 있습니다. 과정. 분명히 나는 이러한 요청이 몇몇 IIS 호출자 스레드를 차단하여 다른 더 빠른 호출이 차단되도록 차단함으로써 정상적인 MVC 컨트롤러를 사용할 수 없었습니다.ASP.NET MVC 비동기 컨트롤러 대 서버 푸시 (COMET/Reverse Ajax)
나는 다음과 같은 두 가지 옵션을 검토 한 결과 :
- ASP.NET MVC의 비동기 컨트롤러
- PokeIn 도서관 역 AJAX (긴 오래된 브라우저를위한 HTTP 요청을 잡고) 또는 WebSocket을 (를 통해 서버 푸시를 할 수 있습니다 최신 브라우저 용 HTML5 사양에서)
이제 두 가지 모두 좋은 실행 가능 옵션처럼 보입니다.
옵션 1은 구현하기가 가장 쉽습니다. 비동기 컨트롤러를 사용하면 IIS 작업자 스레드가 차단되지 않으므로 다른 빠른 API 호출이 원활하게 진행될 수 있습니다. 그러나 비동기 컨트롤러 documentation에서, 나는 차단되고/기다리는 나의 다른 장기간의 (30 ~ mins) 프로세스를 기다리는 다른 비 IIS 쓰레드를 생성한다는 것을 알았다. 나는 "컨트롤러가 비동기인지 비동기인지에 관계없이 컨트롤러에서 차단하거나 잠자면 매우 나쁘다"라고 읽었습니다.
옵션 2에서 클라이언트가 웹 소켓을 지원하는 최신 브라우저를 사용하는 경우 서버 측에 차단 스레드가 없어도 성능이 가장 좋을 것입니다. 클라이언트가 느린 API 호출을 트리거하면 이벤트를 발생시키고 (30 ~ 분 후에 완료) 다른 클라이언트의 브라우저를 업데이트 된 컨텐츠로 업데이트하는 이벤트를 발생시킵니다. 그러나 PokeIn 라이브러리를 사용하는 경우 클라이언트 중 일부에서 WebSocket을 지원하는 브라우저 (예 ... ..)가 없으면 IIS 작업자 스레드 중 하나를 사용하고 있는지 확실하지 않습니다.
옵션 2는 제 요구 사항을 충족시키지 못했습니까? 옵션 1에서 느린 프로세스에서 내 Async Controller를 기다리는 것이 좋지 않습니까? 옵션 1의 또 다른 단점은 사용자가 요청이 완료되기 전에 페이지를 새로 고치면 작업이 완료된 후에 더 이상 작업 업데이트를받지 못한다는 점입니다.
어떤 아이디어라도 환영합니다.
감사