복붙노트

[REDIS] 레디 스 및 Node.js를하고 Socket.io 질문

REDIS

레디 스 및 Node.js를하고 Socket.io 질문

난 그냥 내가 어떤 만족 답변을 찾을 수있는 나는이 두 가지 질문이 있습니다 레디 스 학습과 Node.js를하고있다.

내 첫 번째 질문은 node.js. 내 레디 스 클라이언트를 재사용에 관한 것입니다 나는이 질문에 대한 답을 발견 어떻게 socket.io의 레디 스 연결을 다시 사용하려면? 하지만 충분히 나를 만족하지 않았다.

나는 연결 이벤트 내에서 레디 스 클라이언트를 작성하는 경우 지금, 그것은 각각의 연결에 양산 될 것입니다. 내가 20K 동시 사용자가있을 경우에 따라서, 20K 레디 스 클라이언트가있을 것입니다.

나는 연결 이벤트의 외부 넣을 경우 한 번만 양산 될 것입니다.

대답은 그가 각 기능에 대한 세 가지 클라이언트 연결 이벤트의 외부를 만드는 말하고있다.

그러나, 어떤에서 내가 MySQL이 알고 급부상 자식 프로세스와 병렬로 실행, 당신은 당신이 아이의 인스턴스를 생성하는 기능 내에서 MySQL 클라이언트를 만드는 데 필요한 응용 프로그램을 작성할 때. 당신이 밖에서의 그것을 만드는 경우, MySQL은 자식 프로세스가 동일한 연결을 사용하려고합니다으로 "MySQL 서버가 사라 졌는지"의 오류를 줄 것이다. 그것은 개별적으로 각각의 자식 프로세스 생성한다.

그래서, 당신은 당신이 동시에 2K 메시지를 보낼 30K 동시 사용자가있는 경우, 당신은 바로, 같은 문제로 실행해야합니다, 각 기능에 대한 세 가지 레디 스 클라이언트를 만들 경우에도? 그래서, 모든 "사용자"는 연결 이벤트에서 자신의 레디 스 클라이언트가 있어야합니다. 암 I 오른쪽? 그렇지 않다면, 어떻게 Node.js를 나 레디 스 핸들 동시 요청, 다른 MySQL을보다 더? 그 자체 메커니즘을 가지고 있으며 레디 스 클라이언트 내에서 자식 프로세스 같은 것을 만드는 경우, 왜 우리는 다음 세 가지 레디 스 클라이언트를 생성해야? 하나는 충분합니다.

나는 질문이 분명했다 바랍니다.

- UPDATE -

나는 다음과 같은 질문에 대한 답을 발견했다. http://howtonode.org/control-flow 필요가 대답 없습니다하지만 내 첫 번째 질문은 여전히 ​​유효합니다.

- UPDATE -

내 두 번째 질문은 이것이다. 나는 JS와 Node.js.에없는 좋은 또한입니다 당신이 이벤트를 기다릴 필요가 경우에 따라서, 내가 아는 것과, 첫 번째 함수 내에서 두 번째 기능을 캡슐화 할 필요가있다. (아직 용어를 모른다). 저를 예를 들어 보겠습니다;

socket.on('startGame', function() {
    getUser();
    socket.get('game', function (gameErr, gameId) {
        socket.get('channel', function (channelErr, channel) {
            console.log(user);
            client.get('games:' + channel + '::' + gameId + ':owner', function (err, owner) { //games:channel.32:game.14
                if(owner === user.uid) {
   //do something
                }
            });
        }
    });
});

내가 제대로 배우고 경우 내가 I / O 응답을 기다릴 필요가 경우에 따라서, 나는 함수 내에서 모든 기능을 실행해야합니다. 그렇지 않으면, Node.js를의 비 차단 메커니즘은 병렬 결과를 얻을 것이다,이 경우에는 첫 번째 함수의 실행을 허용하지만, 그것을 얻기 위해 시간이 걸리는 경우 두 번째 기능은 결과가 없을 수 있습니다. 당신은 예를 들어 레디 스에서 결과를 얻고 있으며, 두 번째 함수 내에서 결과를 사용한다면, 당신은 레디 스 기능을 얻을 내에서 캡슐화해야합니다. 그렇지 않으면 두 번째 기능은 결과를받지 않고 실행됩니다.

그래서,이 경우, 만약 내가 재귀 적으로이 같은를 작성해야 할, 나는 7 개 개의 다른 기능을 실행해야하고, 8. 기능은 그들 모두의 결과가 필요합니다? 아니면 내가 뭔가를 놓친 거지.

나는이 너무 분명했다 바랍니다.

고마워요,

해결법

  1. ==============================

    1.사실, 당신은하지 않습니다 :)

    사실, 당신은하지 않습니다 :)

    문제는 Node.js를 예, PHP를 위해 매우 달리 것입니다. Node.js를이 쉽게 수명이 긴 연결 (혜성, WebSocket을, 등)를 포함하여 동시 연결의 많은 양을 처리 할 수있는 주된 이유 중 하나 새로운 연결에하지 산란 자식 프로세스를 수행합니다. 연속적으로 하나 개의 프로세스 내에 이벤트 큐를 사용하는 공정 이벤트 Node.js를. 당신이 멀티 코어 서버 또는 여러 서버를 활용하는 여러 프로세스를 사용하려는 경우, 당신은 (어떻게하지만 이렇게이 질문의 범위를 벗어하기 위해) 수동으로 실행해야합니다.

    따라서 고객의 많은 양의를 제공하기 위해 하나의 레디 스 (또는 MySQL의) 연결을 사용하여 완벽하게 유효한 전략이다. 이 인스턴스와 각 클라이언트 요청에 대한 데이터베이스 연결을 종료하는 오버 헤드를 피할 수 있습니다.

  2. ==============================

    2.당신은 그것을 할 수있는 적절한 방법이 아니다 연결된 각 사용자에 대한 새 레디 스 클라이언트를해서는 안됩니다. 대신 최대 2 ~ 3 클라이언트를 만들고 사용.

    당신은 그것을 할 수있는 적절한 방법이 아니다 연결된 각 사용자에 대한 새 레디 스 클라이언트를해서는 안됩니다. 대신 최대 2 ~ 3 클라이언트를 만들고 사용.

    자세한 내용은이 질문에 체크 아웃 :

    어떻게 socket.io에서 레디 스 연결을 재사용?

  3. ==============================

    3.첫 번째 질문에 관해서는 : "올바른 대답은"당신이 하나 개의 연결과 좋은 생각하게 할 수도 있습니다. 당신이 등 IO, 타이머, 기다리고 무언가를 할 때마다 실제로, 당신은 실제로 큐에 대기 방법을 실행 노드하고 있습니다. 당신은 단지 1 개 단일 연결을 사용하는 경우 따라서, 당신은 실제로 레디 스의 속도는 작업 스레드의 성능 (단일 CPU) 제한 할 것이다 - 아마 초당 콜백의 수백입니다 (대기 콜백 것입니다 비 레디 스 여전히)에 이동 -이 성능 저하가없는 반면, 제한의 종류를 만들 이유가 없다. 그것의 전체에서이 문제를 방지하기 위해 몇 가지 (5-10) 연결을 작성하는 것이 좋습니다. 이 숫자는 느린 데이터베이스, 예를 들어, 가입 간다 MySQL은,하지만 쿼리와 코드 특성의 유형에 따라 달라집니다.

    첫 번째 질문에 관해서는 : "올바른 대답은"당신이 하나 개의 연결과 좋은 생각하게 할 수도 있습니다. 당신이 등 IO, 타이머, 기다리고 무언가를 할 때마다 실제로, 당신은 실제로 큐에 대기 방법을 실행 노드하고 있습니다. 당신은 단지 1 개 단일 연결을 사용하는 경우 따라서, 당신은 실제로 레디 스의 속도는 작업 스레드의 성능 (단일 CPU) 제한 할 것이다 - 아마 초당 콜백의 수백입니다 (대기 콜백 것입니다 비 레디 스 여전히)에 이동 -이 성능 저하가없는 반면, 제한의 종류를 만들 이유가 없다. 그것의 전체에서이 문제를 방지하기 위해 몇 가지 (5-10) 연결을 작성하는 것이 좋습니다. 이 숫자는 느린 데이터베이스, 예를 들어, 가입 간다 MySQL은,하지만 쿼리와 코드 특성의 유형에 따라 달라집니다.

    당신이 최적의 성능을 위해, 당신이 가지고있는 CPU의 수에 따라, 서버에 몇 근로자를 실행해야합니다, 노트를 수행합니다. 두 번째 질문에 관해서 : 그것은 기능, 하나씩 이름을, 오히려 당신이 갈로 정의하는 것이 아니라 코드의 이름을 사용하는 것이 훨씬 더 나은 방법입니다. 일부 상황에서는 메모리 소비를 줄일 수 있습니다.

  4. from https://stackoverflow.com/questions/8946915/redis-and-node-js-and-socket-io-questions by cc-by-sa and MIT license