2013-01-23 5 views
0

내 "긴"응답 중 하나가 다른 AJAX 요청을 차단하는 경우 불쾌한 상황이 있습니다. 나는 동시에 3 개 개의 다른 자원 전화 :Node.js 블록 응답

var list = ['/api/filters','/api/criteria/brands','/api/criteria/genders'] 
list.forEach(function(item){$.post(item)}) 

서버 측에서 내가 로그 파일에 다음 번 볼 수 있습니다 :

GET /api/filters 304 51ms 
GET /api/criteria/genders 200 1ms 
GET /api/criteria/brands 200 0ms 

그게 나를 위해 멋진 모습을하지만, 브라우저에서 그림이 절대적으로 다릅니다.

picture with google chrome network tab

는 그래서 브라우저 첫번째 (긴 요청)에 대한 응답을 기다립니다 만 이후 지난 2 개 결과를받을 것 같습니다.

이 문제의 원인은 무엇일까요?

+0

50ms 미만은 빠른 속도입니다. 그게 뭐가 잘못 되었나요? 단지 네트워크 일 수 있습니다. – adrian

+0

SSD가있는 로컬 macine에있는이 때문에 실시간 지연이 "약간"길어질 것입니다. 그리고 실제로 51ms는 메모리에 캐시 된 JSON 300KB에 대한 응답으로 출력됩니다. (계산, DB 요청 등) – Alber

+0

실제 웹 환경 (AWS, Heroku)에 넣지 마십시오. 귀신을 위해 최적화되지 않습니다. – adrian

답변

0

모든 브라우저는 한 번에 특정 양의 동시 요청을 처리합니다. 동시에 10 건의 아약스 요청을 해지하면 브라우저는이를 스택에 저장하고 하나씩 처리합니다.

this question에있는 브라우저의 동시 요청 (이미지, 자바 스크립트 등을 포함하고 있기 때문에)에 대한 추가 정보를 찾을 수 있습니다.

+0

하지만 콘솔에서 가능한 한 명확하게이 상황을 만들기 위해 3 번만 호출합니다. – Alber

0

노드 서버 실행은 단일 스레드이며 CPU주기를 사용하는 코드는 전체 프로세스를 차단합니다.

결과적으로 GET /api/filters은 많은 CPU 집약적 계산을 수행하면 완료 될 때까지 다른 모든 요청을 차단합니다. 실제로 무엇을하는지에 대한 정보를 추가하면 더 나은 답변을 얻을 수 있습니다.

거기에 IO 작업이있는 경우 비동기 작업을 수행하십시오. 그러면 첫 번째 노드가 IO를 수행하는 동안 노드가 다른 URL을 제공 할 수 있습니다.

관련 문제