2014-12-10 3 views
0

Я работаю в чате, где друзья из Facebook могут разговаривать только друг с другом. Я использую redis, поэтому сохраняю отношение: fb_user_id - user_socket_id. Вот как выглядит моя реализация:node.js и socket.io chat with facebook friends

  • подружиться с facebook;
  • выбор идентификаторов сокетов моих друзей из redis, создание локального списка друзей-сокетов в моем узле клиента;
  • подключение к серверу узлов. Сервер сохраняет мой идентификатор сокета для повтора и уведомляет всех моих друзей о входе в новый логин (обо мне);
  • все мои друзья, обновляющие список локальных друзей-сокетов;
  • Когда кто-то отправляет сообщение чату на сервер, это сообщение поставляется с списком друзей-сокетов, поэтому сервер знает, где нужно отправлять сообщение (только для моих друзей).

Вопрос: это лучшее решение для отправки друзей-сокетов каждый раз на сервер, или лучше получить это отношение на сервере из redis (или создать массив сокетов на сервере). Как адаптировать мою задачу для высокой доступности?

Любые комментарии и предложения приветствуются, спасибо.

Вот мой код (socket.io 1.2.0)

server.js

var app = require('express')(); 
var http = require('http').Server(app); 
var io = require('socket.io')(http); 

var redis = require("redis"), client = redis.createClient(); 
var parts; 
client.select(2, function() {}); 
client.on("error", function (err) { 
    console.log("Error " + err); 
}); 

process.on('uncaughtException', function (err) { 
    console.log(err); 
}); 

app.get('/', function (req, res) { 
    res.sendFile(__dirname + '/index.html'); 
}); 

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

    // on connect 
    socket.on("join", function (data) 
    { 
     if (data) { 
      // notify all friedns about new friend login 
      if (data.to) { 
       if (data.to.length > 0) { 
        for (x in data.to) { 
         io.to(data.to[x]['socket_id']).emit('new friend response', {uid: data.uid, sid: socket.id}); 
        } 
       } 
      } 

      // save or update user socket id to redis 
      parts = split_id(data.uid); 
      client.hset(parts[1], parts[0], socket.id); 

     } 
    }); 

    // disconnect 
    socket.on('disconnect', function() { 
     console.log("user disconnected"); 
    }); 

    // send message by friends-sockets list 
    socket.on('chat message', function (data) { 
     if (data.to.length > 0) { 
      for (x in data.to) { 
       var message = data.msg; 
       io.to(data.to[x]['socket_id']).emit('chat message response', {msg: message, uid: data.uid}); 
      } 
     } 
    }); 
}); 

http.listen(3000, function() { 
    console.log('listening on *:3000'); 
}); 

// split facebook uid in 2 parts (for redis saving) 
function split_id(str) 
{ 
    var n = str.length; 
    var res1 = str.substr(n - 2, 2); 
    var res2 = str.substr(0, n - 2); 
    return [res1, res2]; 
} 

client.js

// friends socket list 
var friends_sockets = []; 
// my data from facebook 
var my_data; 
// my facebook uid 
var my_uid; 

function client() { 
    socket = io('http://server.com:3000'); 

    // connect 
    socket.on('connect', function() { 
     // notify server about login 
     socket.emit('join', {uid: my_uid, to: friends_sockets, from: my_data, type: 'web'}); 
    }); 

    // send chat message to my friends 
    $('.enter_form button').click(function() { 
     if (friends_sockets.length > 0) { 
      socket.emit('chat message', {msg: $('#m').val(), to: friends_sockets, from: my_data, uid: my_uid}); 
     } 
     // add message to my chat 
     $('#messages').append($('<li>').text(my_data.first_name + ' ' + my_data.last_name + ': ' + $('#m').val())); 
     $('#m').val(''); 
     return false; 
    }); 

    // new message listner (waiting for chat messages) 
    socket.on('chat message response', function (data) { 
     $('#messages').append($('<li>').text(data.msg)); 
    }); 

    // new friends lister (update list on friends login) 
    socket.on('new friend response', function (data) { 
     var found = false; 
     if (friends_sockets.length > 0) { 
      for (x in friends_sockets) { 
       if (friends_sockets[x]['uid'] == data.uid) { 
        friends_sockets[x]['socket_id'] = data.sid; 
        found = true; 
       } 
      } 
     } 

     if (found === false) { 
      friends_sockets.push(data); 
     } 
    }); 
} 

ответ

0

Что касается Вашего вопроса о высокой за доступностью, имеют вид на

для примера конфигурации с использованием nginx, нескольких процессов узла и Redis в качестве хранилища сеансов.

Смежные вопросы