복붙노트

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

REDIS

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

여기 술집 / 서브 레디 스에 웹 소켓으로 socket.io 및 백엔드를 사용하여 내 코드입니다.

var io = io.listen(server),
    buffer = [];

var redis = require("redis");

var subscribe = redis.createClient();  **<--- open new connection overhead**

io.on('connection', function(client) {

    console.log(client.request.headers.cookie);

    subscribe.get("..", function (err, replies) {

    });

    subscribe.on("message",function(channel,message) {

        var msg = { message: [client.sessionId, message] };
        buffer.push(msg);
        if (buffer.length > 15) buffer.shift();
        client.send(msg);
    });

    client.on('message', function(message){
    });

    client.on('disconnect', function(){
        subscribe.quit();
    });
});

모든 새로운 IO 요청은 새로운 레디 스 연결을 생성합니다. (100 개) 탭을 가진 사람 열려있는 브라우저 경우 다음 레디 스 클라이언트 (100 개) 연결을 엽니 다. 그것은 좋은 보이지 않습니다.

그것은 쿠키 같은 경우 레디 스 연결을 다시 할 수 있습니까? 그래서 누군가가 열려 많은 브라우저 탭은 열린 1 개 연결로 처리합니다.

해결법

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

    1.당신은 "연결"이벤트에서 클라이언트를 인스턴스화하는 경우 실제로 당신은 단지 모든 연결에 대해 새 레디 스 클라이언트를 만들 수 있습니다. 나는 채팅 시스템을 만들 때 세 레디 스 클라이언트를 만들 때 수행하는 것을 선호 무엇. 출간 가입 및 레디 스에 값을 저장 하나씩.

    당신은 "연결"이벤트에서 클라이언트를 인스턴스화하는 경우 실제로 당신은 단지 모든 연결에 대해 새 레디 스 클라이언트를 만들 수 있습니다. 나는 채팅 시스템을 만들 때 세 레디 스 클라이언트를 만들 때 수행하는 것을 선호 무엇. 출간 가입 및 레디 스에 값을 저장 하나씩.

    예를 들어 :

    var socketio = require("socket.io")
    var redis = require("redis")
    
    // redis clients
    var store = redis.createClient()
    var pub = redis.createClient()
    var sub = redis.createClient()
    
    // ... application paths go here
    
    var socket = socketio.listen(app)
    
    sub.subscribe("chat")
    
    socket.on("connection", function(client){
      client.send("welcome!")
    
      client.on("message", function(text){
        store.incr("messageNextId", function(e, id){
          store.hmset("messages:" + id, { uid: client.sessionId, text: text }, function(e, r){
            pub.publish("chat", "messages:" + id)
          })
        })
      })
    
      client.on("disconnect", function(){
        client.broadcast(client.sessionId + " disconnected")
      })
    
      sub.on("message", function(pattern, key){
        store.hgetall(key, function(e, obj){
          client.send(obj.uid + ": " + obj.text)
        })
      })
    
    })
    
  2. ==============================

    2.레디 스 동시 연결 하이 레벨에 대해 최적화된다. node_redis 모듈에서 여러 데이터베이스 연결 및 연결 풀 구현에 대한 논의도 있습니다.

    레디 스 동시 연결 하이 레벨에 대해 최적화된다. node_redis 모듈에서 여러 데이터베이스 연결 및 연결 풀 구현에 대한 논의도 있습니다.

    당신은 적극적으로 하나 개의 탭을 연결 유지하기 위해 클라이언트 측에서 예를 들어 HTML5 저장 용으로 사용할 수 있으며 다른 스토리지 이벤트를 통해 통신 / 메시지를 처리합니다. 그것은이 질문에 관련이.

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

    3.나는 클라이언트가 모든 청취자로 전송해서는 안됩니다 해당 채널에 개인 채널을 구독하고 게시 할 수 있어야한다는 추가 요구 사항이 정확히 문제가 있었다. 나는 소형 플러그인을 작성하여이 문제를 해결하려고했습니다. 플러그인 :

    나는 클라이언트가 모든 청취자로 전송해서는 안됩니다 해당 채널에 개인 채널을 구독하고 게시 할 수 있어야한다는 추가 요구 사항이 정확히 문제가 있었다. 나는 소형 플러그인을 작성하여이 문제를 해결하려고했습니다. 플러그인 :

    특히 유용한 경우 (예 : 레디 스 - 투 - 이동 등) 레디 스 연결 제한이있는 장소에 프로토 타입. SO 링크 : https://stackoverflow.com/a/16770510/685404

  4. ==============================

    4.당신은 청취자 클라이언트 차단을 제거해야합니다.

    당신은 청취자 클라이언트 차단을 제거해야합니다.

    var io = io.listen(server),
        buffer = [];
    
    var redis = require("redis");
    
    var subscribe = redis.createClient();  
    
    io.on('connection', function(client) {
    
        console.log(client.request.headers.cookie);
    
        subscribe.get("..", function (err, replies) {
    
        });
    
        var redis_handler = function(channel,message) {
    
            var msg = { message: [client.sessionId, message] };
            buffer.push(msg);
            if (buffer.length > 15) buffer.shift();
            client.send(msg);
        };
    
        subscribe.on("message", redis_handler);
    
    
        client.on('message', function(message){
        });
    
        client.on('disconnect', function(){
            subscribe.removeListerner('message', redis_handler)
            //subscribe.quit();
        });
    });
    

    참조 레디 스, Node.js를, 그리고 Socket.io : 크로스 서버 인증 및 이해 Node.js를

  5. ==============================

    5.상점이 질문에 부탁 된 이후 훨씬 간단 상태가되어 레디 스를 사용하여 / 대답했다. 지금에 내장되어 있습니다.

    상점이 질문에 부탁 된 이후 훨씬 간단 상태가되어 레디 스를 사용하여 / 대답했다. 지금에 내장되어 있습니다.

    참고, 당신은 (여러 개의 CPU를 사용하는) 새로운 노드 클러스터링 기능을 사용하고 있기 때문에 당신이 레디 스를 사용하는 경우, 서버를 생성하고 (클러스터 포크의 각각의 내부에 청취자를 부착해야한다는이 사실의 아무 곳이나 설명되지 않습니다 문서;)). 내가 찾은 온라인으로있는 유일한 좋은 코드 예제 커피 스크립트로 작성하고 나는 많은 사람들이 "그냥 일을하지 않는"것은 이런 종류의 말을보고, 당신이 잘못을 할 경우 확실히하지 않습니다. 여기에 "바로 그 일을"의 예입니다 (하지만 커피 스크립트에)

  6. from https://stackoverflow.com/questions/5739357/how-to-reuse-redis-connection-in-socket-io by cc-by-sa and MIT license