복붙노트

[REDIS] 어떻게 인스턴트 메시징 시스템 레디 스 펍 / 하위를 설계?

REDIS

어떻게 인스턴트 메시징 시스템 레디 스 펍 / 하위를 설계?

나는 레디 스 펍 / 하위에 새로운 오전. 나는 IM처럼 시스템의 채팅 기능을 가지고있다. 나는 레디 스 펍 / 하위를 사용하고 싶습니다 그래서. 내가 샘플을 조사 것처럼 그들의 대부분은 설계 대화방을 기반으로합니다. 내 시스템에서 내가 좋아하는 사용자들 사이에 여러 개의 대화방이있을 것이다;

A:B
A:C
D:C
E:F

그래서, 줄 위의 객실입니다. 그리고는 다음과 같은 Node.js를 사용하여 서버를 구현;

var store = redis.createClient();
var pub = redis.createClient();
io.sockets.on('connection', function (socket) {
    var sub = redis.createClient();

    sub.on("message", function(pattern, data){
            data = JSON.parse(data);
        socket.send(JSON.stringify({ type: "chat", key: pattern, nick: data.nickname, message: data.text }))
        }
    });

    socket.on('message', function (messageData) {
        store.incr("messageNextId", function(e, messageId) {
        var room = ""
        var from = messageData.clientId > socket.nickname ? socket.nickname : messageData.clientId;
        var to = messageData.clientId < socket.nickname ? socket.nickname : messageData.clientId;   
            room = from + ":" + to;

        var message = { id: messageId, nickname: socket.nickname, text: messageData.text };
        store.rpush("rooms:" + room, JSON.stringify(message), function(e, r) {  
             pub.publish(room, JSON.stringify(message))
        });
    });
});

당신은 내가 각 연결에 대한 새로운 레디 스 가입자를 만드는 오전 볼 수 있듯이. 다른 대화방 샘플 레디 스 가입자 클라이언트에서 세계적으로 작성됩니다. 게시자가 메시지를 게시 할 때 연결된 모든 클라이언트가 그것을 얻을해야하기 때문에이 해결할 수있는 문제를 자신의 문제가 세 개의 연결을 항상 존재합니다. 하지만 여기에 제약이있다. 나는 두 명의 사용자 만이 사용자가되어야 가입자 사이에 채팅 세션을 열고 자. 내가 싶습니다하지만 확인을 경우 레디 스 각 연결에 대한 새 가입자 클라이언트를 작성하는 내가 아는하지 않는 작품 위의 코드입니다.

당신의 제안을 듣고 좋은 것입니다. 미리 감사드립니다.

해결법

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

    1.언제나처럼, 당신은 당신의 자신의 사용의 경우이 같은 벤치 마크 일 필요 - 그것은 일반적인 조언을 줄 수 없습니다. 당신도 시스템 전체 또는 레디 스 사용자를 위해, 시스템에 열려있는 파일의 최대 수를 늘려야 할 수도 있습니다. 이것은 또한 물론, 웹 서버를 실행하는 사용자에게 적용됩니다.

    언제나처럼, 당신은 당신의 자신의 사용의 경우이 같은 벤치 마크 일 필요 - 그것은 일반적인 조언을 줄 수 없습니다. 당신도 시스템 전체 또는 레디 스 사용자를 위해, 시스템에 열려있는 파일의 최대 수를 늘려야 할 수도 있습니다. 이것은 또한 물론, 웹 서버를 실행하는 사용자에게 적용됩니다.

    말했다, 당신은 레디 스 가입자 사용자 잎) (socket.on을 수신 할 수 있는지 확인합니다 ( '분리')하고 종료한다. 당신은 또한 socket.io는 레디 스 백엔드, 레버리지 레디 스 펍 / 서브를 가지고 알고 관심이있을 수 있습니다, 당신은 이미 소켓에 따라하고 있기 때문에 것을 사용하여 자신에게 약간의 수고를 덜 수 있도록 또한, 객실의 개념이 .io.

    편집 : 빠른 검사 후, 나는 991 가입자 후 레디 스에서이 오류 메시지가 :

    Ready check failed: Error: Error: ERR max number of clients reached
    

    여기에 기본 redis.conf에서이다 :

    # Set the max number of connected clients at the same time. By default
    # this limit is set to 10000 clients, however if the Redis server is not
    # able ot configure the process file limit to allow for the specified limit
    # the max number of allowed clients is set to the current file limit
    # minus 32 (as Redis reserves a few file descriptors for internal uses).
    #
    # Once the limit is reached Redis will close all the new connections sending
    # an error 'max number of clients reached'.
    #
    # maxclients 10000
    

    내 빠른 테스트는 테스트의 권리에 관한 것 (992)에 연결된 클라이언트, 후 실패 때문에 내 시스템 (우분투 11.11), 1024 제한 NOFILE 기본 제공됩니다 (또한 게시자에 대한 하나 개의 클라이언트를 가지고). 당신에게 나의 제안은 당신의 NOFILE 제한을 검사하는 것입니다 (내 시스템에이 /etc/security/limits.{conf,d/*에있어}와 레디 스의 MaxClients의를 설정하고 벤치 마크, 벤치 마크, 벤치 마크!

  2. from https://stackoverflow.com/questions/10142246/how-to-design-redis-pub-sub-for-an-instant-messaging-system by cc-by-sa and MIT license