Node.js (6.9.0)에 socket.io 기반 서버를 쓰고 있습니다. 나는 내장 된 cluster
모듈을 사용하여 다중 프로세스를 가능하게한다. 지금은 마스터와 근로자라는 두 가지 프로세스 만 있습니다. 마스터는 연결을 수신하고 작업자가 IPC를 통해 쿼리 할 수있는 메모리 내 전역 데이터 구조를 유지 관리합니다. 작업자 프로세스는 들어오는 각 연결을 처리하여 대부분의 작업을 처리합니다.클러스터 된 socket.io 서버가 응답하지 않습니다.
서버가 300 명의 동시 사용자에게 스트레스를 받았을 때 내부 오류가 발생하지 않을 수있는 조건이 발견되었습니다. 동시성이 낮 으면 매달린 조건이 표시되지 않습니다.
내가 디버깅의 모든 형태 가능 해요합니다 (debug
모듈을 사용하여 : debug
에 socket.io:socket
, socket.io:client
뿐만 아니라 내 자신의 사용자 정의 통화).
내가 볼 수있는 마지막 활동은 socket.io
이지만 메시지는 자체 "테스트 종료"주기로 인해 소켓이 닫히고 있음을 나타냅니다 ("이유 클라이언트 네임 스페이스 연결 끊기"). 들어오는 연결 서비스가 제공되지 않는 것 같습니다.
나는 테스트 클라이언트로 Artillery.io을 사용하고 있습니다.
서버 응용 프로그램에서 캐치되지 않는 예외에 대한 처리기가 있고 모든 주위에 try-catch
블록이 있습니다.
이전 반복에서 나는 또한 cluster
을 사용했지만 책임을 바꿔 마스터 프로세스가 연결을 처리하도록했습니다 (작업자가 글로벌 데이터를 처리 함). 그 같은 실패를 전시하지 않았다. 연결 배포에 문제가 있는지 확실하지 않습니다. 이를 위해 cluster
의 내부 작업을 모니터링하기 위해 internalMessage
이벤트를 버렸습니다.
연결 배포 또는 고정 세션에 다른 모듈을 사용하고 있지 않습니다. 연결을 처리하는 프로세스가 단 하나 (현재로서는)이므로이 프로세스는 적절하지 않습니다.
어떻게 마스터에서 작업자로 연결을 전달합니까? – robertklep
나는'cluster'가 제공하는 내장 메커니즘을 사용하고 있습니다 (이해합니다). 본질적으로, 저는 명시 적으로 아무것도하지 않고 있습니다. 작업자는 서버를 만들고,'socket.io'를 초기화 한 다음 특정 포트를 청취합니다. '클러스터'는 작업자가 마스터에게 전화를 걸고 작업자와의 새로운 연결을 라우트 ("라운드 로빈"을 통해)하도록 지시합니다. – gboysko
'cluster'가 제공하는 다른 방법 ([this] (https://nodejs.org/api/cluster.html#cluster_cluster_schedulingpolicy), 특히'cluster.SCHED_NONE' 참조)을 시도해 볼 수는 있지만, 다른 것을 지배 할 가치가있을 수도 있습니다 마스터가 보유하고있는 글로벌 데이터 구조를 질의하는 작업자를 일시적으로 비활성화하는 것과 같은 일들이 있습니다. 나는 한 명의 노동자 만이 일시적으로 존재한다고 가정하고 (이 문제가 해결되면 여러 명의 노동자까지 확장 할 수 있습니까?) – robertklep