2014-11-09 12 views
1

Node.js는 단일 스레드입니다. 느린 클라이언트가 요청을하는 경우, 완료 될 때까지 스레드를 차단할 수 있다고 상상합니다. 말이 돼 ?node.js에서 느린 클라이언트 연결을 어떻게 처리합니까?

어떻게 저속 연결을 처리하나요? 너무 오래 걸리는 경우 연결을 종료하는 것이 합리적입니까? 어떻게 이것을 결정합니까? 요청이 얼마나 오래 걸리는지 측정하고, 너무 오래 걸리면 요청을 종료하는 방법은 무엇입니까? 나는 응답을 되돌려 보내는 데 걸리는 시간을 언급하지 않고있다. 난 그냥 노드가 요청을 처리하는 데 필요한 모든 데이터를 수신하는 데 걸리는 시간을 말하는 것입니다. 이것은 합법적 인 시나리오입니까? 내가 그렇지 않으면 DOS을 공격 Node.js를 서버에 정말 쉬운 것입니다,이 작업을 수행하는 몇 가지 방법이있을 상상

은 ...

편집 : POST 요청에서 데이터는 덩어리에 온다 . 그러면 천천히 들어 오면 어떨까요? 이걸 어떻게 시뮬레이트 할 지 모르겠습니다. 그러나 이것이 노드에서 문제가된다면 PHP 등에서 문제가 될 수 있습니다. 많은 연결을 생성해야하기 때문에 서버를 공격하는 데 아주 느립니다.

답변

0

클라이언트 요청 데이터가 느리게 들어오는 지 여부는 중요하지 않습니다. 노드의 I/O는 비동기 및 비 차단입니다. 따라서 소켓에서 장시간 데이터 덩어리를 사용할 수없는 경우 노드는 다른 소켓에서 데이터 청크를 수신하는 등 다른 작업을 수행 할 수 있습니다.

원하는 시간 동안 소켓에 데이터가 표시되지 않으면 작동하지 않는 비활성 시간 제한을 설정할 수 있습니다. HTTP의 경우 기본 소켓을 자동으로 닫을 수있는 server.setTimeout()을 통해 전체 요청 시간 제한을 설정할 수 있습니다. 또는 콜백을 전달하면 원하는 시간 제한을 처리 할 수 ​​있습니다. TCP의 경우 socket.setTimeout()입니다.

+0

똑같은 스택을 사용합니다. SLOW 연결로 애플리케이션에 테스트를로드하면 최대 응답 시간이 최대 30 초까지 늘어날 수 있습니다. 하지만 빠른 연결로 할 때 최대 응답 시간은 1 초입니다. 느린 연결에 관한 것이 아니라면, 당신이 생각하는 이유는 무엇입니까? – scaryguy

관련 문제