2017-04-03 2 views
0

Node.js (6.9.0)에 socket.io 기반 서버를 쓰고 있습니다. 나는 내장 된 cluster 모듈을 사용하여 다중 프로세스를 가능하게한다. 지금은 마스터와 근로자라는 두 가지 프로세스 만 있습니다. 마스터는 연결을 수신하고 작업자가 IPC를 통해 쿼리 할 수있는 메모리 내 전역 데이터 구조를 유지 관리합니다. 작업자 프로세스는 들어오는 각 연결을 처리하여 대부분의 작업을 처리합니다.클러스터 된 socket.io 서버가 응답하지 않습니다.

서버가 300 명의 동시 사용자에게 스트레스를 받았을 때 내부 오류가 발생하지 않을 수있는 조건이 발견되었습니다. 동시성이 낮 으면 매달린 조건이 표시되지 않습니다.

내가 디버깅의 모든 형태 가능 해요

합니다 (debug 모듈을 사용하여 : debugsocket.io:socket, socket.io:client뿐만 아니라 내 자신의 사용자 정의 통화).

내가 볼 수있는 마지막 활동은 socket.io이지만 메시지는 자체 "테스트 종료"주기로 인해 소켓이 닫히고 있음을 나타냅니다 ("이유 클라이언트 네임 스페이스 연결 끊기"). 들어오는 연결 서비스가 제공되지 않는 것 같습니다.

나는 테스트 클라이언트로 Artillery.io을 사용하고 있습니다.

서버 응용 프로그램에서 캐치되지 않는 예외에 대한 처리기가 있고 모든 주위에 try-catch 블록이 있습니다.

이전 반복에서 나는 또한 cluster을 사용했지만 책임을 바꿔 마스터 프로세스가 연결을 처리하도록했습니다 (작업자가 글로벌 데이터를 처리 함). 그 같은 실패를 전시하지 않았다. 연결 배포에 문제가 있는지 확실하지 않습니다. 이를 위해 cluster의 내부 작업을 모니터링하기 위해 internalMessage 이벤트를 버렸습니다.

연결 배포 또는 고정 세션에 다른 모듈을 사용하고 있지 않습니다. 연결을 처리하는 프로세스가 단 하나 (현재로서는)이므로이 프로세스는 적절하지 않습니다.

+1

어떻게 마스터에서 작업자로 연결을 전달합니까? – robertklep

+0

나는'cluster'가 제공하는 내장 메커니즘을 사용하고 있습니다 (이해합니다). 본질적으로, 저는 명시 적으로 아무것도하지 않고 있습니다. 작업자는 서버를 만들고,'socket.io'를 초기화 한 다음 특정 포트를 청취합니다. '클러스터'는 작업자가 마스터에게 전화를 걸고 작업자와의 새로운 연결을 라우트 ("라운드 로빈"을 통해)하도록 지시합니다. – gboysko

+0

'cluster'가 제공하는 다른 방법 ([this] (https://nodejs.org/api/cluster.html#cluster_cluster_schedulingpolicy), 특히'cluster.SCHED_NONE' 참조)을 시도해 볼 수는 있지만, 다른 것을 지배 할 가치가있을 수도 있습니다 마스터가 보유하고있는 글로벌 데이터 구조를 질의하는 작업자를 일시적으로 비활성화하는 것과 같은 일들이 있습니다. 나는 한 명의 노동자 만이 일시적으로 존재한다고 가정하고 (이 문제가 해결되면 여러 명의 노동자까지 확장 할 수 있습니까?) – robertklep

답변

0

cluster 스케줄 정책을 라운드 로빈 (SCHED_RR)에서 없음 (OS 특정 (SCHED_NONE))으로 변경하여 교수형 조건을 제거 할 수있었습니다. 이것이 연결 배포판의 버그 (또는 스케줄링 정책에 내재되어있는 다른 버그)로 인한 것인지 여부는 알 수 없지만이 변경 사항은 걸려있는 상태를 방지하는 것으로 보입니다.

관련 문제