2013-05-28 6 views
2

클라이언트 (브라우저)가 최대 30 분 (또는 그 이상)이 소요되는 API 호출을 수행 할 수있는 ASP.NET MVC site을 구축하고 있습니다. 과정. 분명히 나는 ​​이러한 요청이 몇몇 IIS 호출자 스레드를 차단하여 다른 더 빠른 호출이 차단되도록 차단함으로써 정상적인 MVC 컨트롤러를 사용할 수 없었습니다.ASP.NET MVC 비동기 컨트롤러 대 서버 푸시 (COMET/Reverse Ajax)

나는 다음과 같은 두 가지 옵션을 검토 한 결과 :

  1. ASP.NET MVC의 비동기 컨트롤러
  2. PokeIn 도서관 역 AJAX (긴 오래된 브라우저를위한 HTTP 요청을 잡고) 또는 WebSocket을 (를 통해 서버 푸시를 할 수 있습니다 최신 브라우저 용 HTML5 사양에서)

이제 두 가지 모두 좋은 실행 가능 옵션처럼 보입니다.

옵션 1은 구현하기가 가장 쉽습니다. 비동기 컨트롤러를 사용하면 IIS 작업자 스레드가 차단되지 않으므로 다른 빠른 API 호출이 원활하게 진행될 수 있습니다. 그러나 비동기 컨트롤러 documentation에서, 나는 차단되고/기다리는 나의 다른 장기간의 (30 ~ mins) 프로세스를 기다리는 다른 비 IIS 쓰레드를 생성한다는 것을 알았다. 나는 "컨트롤러가 비동기인지 비동기인지에 관계없이 컨트롤러에서 차단하거나 잠자면 매우 나쁘다"라고 읽었습니다.

옵션 2에서 클라이언트가 웹 소켓을 지원하는 최신 브라우저를 사용하는 경우 서버 측에 차단 스레드가 없어도 성능이 가장 좋을 것입니다. 클라이언트가 느린 API 호출을 트리거하면 이벤트를 발생시키고 (30 ~ 분 후에 완료) 다른 클라이언트의 브라우저를 업데이트 된 컨텐츠로 업데이트하는 이벤트를 발생시킵니다. 그러나 PokeIn 라이브러리를 사용하는 경우 클라이언트 중 일부에서 WebSocket을 지원하는 브라우저 (예 ... ..)가 없으면 IIS 작업자 스레드 중 하나를 사용하고 있는지 확실하지 않습니다.

옵션 2는 제 요구 사항을 충족시키지 못했습니까? 옵션 1에서 느린 프로세스에서 내 Async Controller를 기다리는 것이 좋지 않습니까? 옵션 1의 또 다른 단점은 사용자가 요청이 완료되기 전에 페이지를 새로 고치면 작업이 완료된 후에 더 이상 작업 업데이트를받지 못한다는 점입니다.

어떤 아이디어라도 환영합니다.

감사

답변

0

PokeIn는 내부 웹 소켓 서버를 가지고 있으므로 웹 소켓과 AJAX 연결 메시지를 푸시 동일한 메모리/스레드 풀을 사용한다. 배달 시간은 확실히 ajax와 websocket에 따라 다르지만 선택하는 방법/옵션에 따라 그 차이가 있습니다. 게다가 클라이언트는 WebSocket을 지원하지 않고 클라이언트를 처리 할 필요가 없기 때문에 혜성 아약스의 폴백 (Pokein fallback)을 이미 알고있을 것입니다.

희망 사항은 옵션 2에 대한 질문에 대한 답변입니다.