node.js가 한 번에 6 개의 요청 만 처리하는 이유는 무엇입니까?
약간 다르지만 불행히도 비대칭 REST API가있는 중앙 서버에 대한 프록시로 REST API를 구현하는 node.js 서버가 있습니다.
다양한 브라우저에서 실행되는 클라이언트는 노드 서버에 중앙 서버에서 작업을 가져 오도록 요청합니다. 노드 서버는 중앙 서버에서 모든 작업 ID 목록을 가져와 클라이언트에 반환합니다. 그런 다음 클라이언트는 프록시를 통해 ID 당 두 개의 REST API 호출을 수행합니다.
내가 말할 수있는 한,이 작업은 모두 수행됩니다. 콘솔 로그에서 클라이언트를 시작하면 다음과 같이 표시됩니다.
Requested GET URL under /api/v1/tasks/*: /api/v1/tasks/
중앙 서버에서 목록을 가져옵니다. 응답을 받자 마자 서버는이를 매우 빠르게 표시합니다.
Requested GET URL under /api/v1/tasks/id/:id :/api/v1/tasks/id/438
Requested GET URL under /api/v1/workflow/id/:id :/api/v1/workflow/id/438
Requested GET URL under /api/v1/tasks/id/:id :/api/v1/tasks/id/439
Requested GET URL under /api/v1/workflow/id/:id :/api/v1/workflow/id/439
Requested GET URL under /api/v1/tasks/id/:id :/api/v1/tasks/id/441
Requested GET URL under /api/v1/workflow/id/:id :/api/v1/workflow/id/441
그런 다음 구매 요청 쌍이 중앙 서버에서 결과를 얻을 때마다 다른 두 줄이 매우 빠른 속도로 빠져 나갑니다.
따라서 node.js 서버는 한 번에 6 개의 개의 요청 만 기꺼이 처리하는 것입니다.
Node 자체에서 부과하는 TCP 연결 제한은 없습니다. (요점은 매우 동시 적이며 수천 개의 동시 연결을 처리 할 수 있습니다.) OS 는 TCP 연결을 제한 할 수 있습니다 .
백엔드 서버의 어떤 종류의 제한에 도달하거나 내장 HTTP 라이브러리의 연결 제한에 도달 할 가능성이 더 높지만 해당 서버 또는 노드 구현에 대한 자세한 내용 없이는 말하기 어렵습니다.
Node에 내장 된 HTTP 라이브러리 (그리고 그 위에 구축 된 대부분의 라이브러리)는 연결 풀 ( 클래스 를 통해)을 유지 하는 HTTP 연결 유지를 사용할 수 있습니다. 이렇게하면 설치된 서버에 많은 구매가 설치됩니다. TCP 연결을 받고, HTTP 요청을 만들고, 응답을 받고, TCP 연결을 닫고, 반복하는 대신; 기본 된 TCP 연결에서 새 요청을 발행 할 수 있습니다.Agent
노드 0.10 이하에서 HTTP 에이전트는 기본적으로 단일 호스트에 대해 5 개의 동시 연결 만에 다. 쉽게 쉽게 사용할 수 있습니다. : ( require
HTTP 모듈을 라고 가정 http
)
http.globalAgent.maxSockets = 20; // or whatever
노드 0.12 는 기본값 maxSockets
을 Infinity
.
어떤 종류의 연결 제한을 유지하는 것이 좋습니다. 1 초에 수백 개의 HTTP 요청으로 백엔드 서버를 완전히 압도하고 싶지는 않습니다. 서버에 추가가 걸리지 않도록 요청을 조절하여 에이전트의 연결 풀이 작업을 수행하는 것보다 성능이 나빠질 가능성이 높은 것입니다. 가장 좋은 방법은 몇 가지 실험을 실행하여 상황에 맞는 최적의 동시 요청 수를 확인하는 것입니다.
당신은 풀링을 사용하는 경우에는, 당신은 풀을 완전히 제거 할 수 있습니다. 바이 패스-전송 agent
을 false
요청 옵션에서 :
http.get({host:'localhost', port:80, path:'/', agent:false}, callback);
이 경우 동시 HTTP 요청에 대한 제한이 전혀 없습니다.
브라우저의 동시 연결 수에 대한 제한입니다.
많이 사용되는 브라우저에서 허용되는 동시 AJAX (XmlHttpRequest) 요청은 몇 개입니까?
나는 문제를 진단하는 데 도움이 된 다른 답변을 찬성했습니다. 단서는 노드의 소켓 제한이 5 개였고 한 번에 6 개를 얻었습니다. 6은 Chrome의 한계로, 서버를 테스트하는 데 사용했습니다.
중앙 서버에서 데이터를 어떻게 가져오고 있습니까? "노드는 연결을 제한하지 않습니다"는 http
모듈로 HTTP 요청을 할 때 완전히 정확하지 않습니다 . 방식으로 이루어진 이러한 클라이언트 요청 고객은의 http.globalAgent
인스턴스를 사용 http.Agent
하며 각 요청 고객 http.Agent
에는 maxSockets
지정된 호스트에 대해 에이전트가 열 수있는 소켓 수를 결정하는 설정이 있습니다. 부케은 5입니다.
따라서 http.request
또는 http.get
(또는 해당 메소드에 의존하는 라이브러리)를 사용하여 중앙 서버에서 데이터를 가져 오는 경우 값을 변경 http.globalAgent.maxSockets
(또는 http.Agent
사용중인 인스턴스에서 설정을 수정 ) 할 수 있습니다.
보다 :
http.Agent
선적 서류 비치agent.maxSockets
선적 서류 비치http.globalAgent
선적 서류 비치- 고유 한 에이전트를 지정
http.request
하는agent
매개 변수를 포함 하여 많은 수있는 옵션
내 서버에서 동일한 문제를 보았습니다. 4 개의 요청 만 처리하고 있습니다. 이미 0.12 maxsockets에서 설명했듯이 방송은 무한대입니다. 그것은 쉽게 서버를 압도합니다. 요청을 10으로 제한
http.globalAgent.maxSockets = 20;
내 문제를 해결했습니다.
결과를 클라이언트에 반환하는 것이 수입? 노드는 하나의 모든 것을 처리합니다. 따라서 멋진 응답 구문 분석이나 양보하지 않는 다른 작업을 수행하면 모든 요청이 차단됩니다.
참고 URL : https://stackoverflow.com/questions/12060869/why-is-node-js-only-processing-six-requests-at-a-time
'ProgramingTip' 카테고리의 다른 글
Windows 용 Markdown 미리보기 애플리케이션 (0) | 2020.11.16 |
---|---|
'uint32_t'는 유형의 이름을 지정하지 않습니다. (0) | 2020.11.16 |
m2e-wtp 오류 : (0) | 2020.11.16 |
Rails 4 : 매개 변수에 속성 삽입 (0) | 2020.11.16 |
Postman으로 POST 매개 변수를 강력히 사용하지 않습니다. (0) | 2020.11.16 |