2010-06-25 5 views
2

AJAX long polling을 위해 보통의 스레드 된 웹 서버 (예 : Apache)를 사용하는 것은 좋지 않은 디자인이라고 생각합니다. 정말 이유를 이해합니다.왜 비동기 요청 (예 : AJAX long polling)을위한 이벤트 루프가 필요합니까?

각각의 longpolling 요청이 정상적인 것보다 훨씬 더 많은 시간이 걸리므로 (따라서 프로세서를 묶음)? 그렇다면 스레드는 실제로 많은 오버 헤드를 뽑아서 사용하기 전에 잠시 유휴 상태를 유지할 수 없습니까?

답변

7

AJAX 폴링은 클라이언트 쪽 자바 스크립트가 즉시 충족되지 않는 AJAX 요청을하는 경우입니다. 대신, 서버는 클라이언트에게 응답을 푸시 할 때까지 기다린 다음 이미 열려있는 AJAX 컨텍스트를 사용합니다. (오른쪽?)

각 연결 자체 스레드를 처리하는 웹 서버에서 열린 연결로 인해 웹 사이트의 각 클라이언트에 대해 하나의 스레드가 만들어집니다. 스레드는 클라이언트가 연결을 닫을 때까지 계속 실행됩니다. "running"이라고하면, 스레드가 존재하고 서버 리소스를 차지하고 있음을 의미합니다. sleep() 또는 wait() 함수에서 유휴 상태 일 수 있습니다. 그러나 이벤트 기반 서버에서 사용되는 것보다 훨씬 더 많은 시스템 자원을 소비합니다.

+0

+1 - 긴 폴링을 정의합니다. :) –

1

프로세서를 묶는 것이 아니라 스레드 풀의 연결과 스레드를 차단하고 있습니다. 그런 다음 서버는 더 큰 스레드 풀로 구성되어야합니다.

응용 프로그램이 페이스 북과 경쟁하려고한다면 중대한 문제가있을 수 있습니다. SME에서 점심 주문을위한 내부 응용 프로그램 인 경우 아무도 다칠 수 없습니다.

0

답변에 영향을 줄 수있는 다양한 요소가 있기 때문에 이것은 실제로 잘린 말린 질문이 아닙니다.

예를 들어 yaws (Erlang으로 작성된 웹 서버)를 사용하고 있습니까? 그렇다면 웹 서버의 포트를 묶는 것 외에는 문제가되지 않지만 스레드는 문제가되지 않습니다.

Java NewIO API를 사용하고있어 각 연결이 전용 스레드를 사용하지 않으면 스레드에 문제가되지 않습니다.

하지만 리소스를 불필요하게 묶어 놓고 있다면, 현재하고있는 일과 관계없이 불량합니다. 예를 들어, 데이터베이스 연결을 열린 상태로 유지하는 경우 몇 가지 주요 처리를 수행 한 다음 다시 작성하십시오. 이는 잘못된 디자인이기도합니다.

필요할 때만 리소스를 보관하십시오.

상당한 시간이 소요되는 일부 처리를 수행하려는 경우보다 비동기식 솔루션을 살펴볼 수 있습니다.

예를 들어, 사용자가 요청이 완료되었는지 확인하는 데 사용할 수있는 고유 한 번호를 지정하면 컴퓨터를 종료하거나 원하는 경우 언제든지 확인하고 아무 것도 잃지 않고 걱정할 필요가 없습니다.