在多个服务器中使用socket.io和memcached(Auto Scaling)

时间:2016-12-12 19:07:25

标签: node.js sockets amazon-web-services socket.io memcached

我正在使用this memcached package并且我正在尝试从我的服务器获取数据,该数据存储我的PHP会话和memcache。每当有人进入我的网站时,一个值存储在变量$_SESSION["user"]中(用于聊天),我希望获得与socket.io一起使用的值(以定义谁在线并发送消息,无论服务器),因为如果我与server 2相关联,server 1上的任何人都无法在线看到我或向我发送消息,那么,我做了:

var express = require("express"),
    app = express(),
    http = require("http").Server(app),
    io = require("socket.io")(http),
    Memcached = require("memcached"),
    users = {};

// app.use(express.static(__dirname + "/scripts"));

io.on("connection", function(socket) {
    var mem = new Memcached("privateipofmymemcachedserver:11211");

    mem.get("user", function(err, data) {
        if(err) {
            return console.error(err);
        }

        if(data === false) {
            return console.error("Data no found!");
        }

        console.log("Data: " + data);
    });

    // From client, sended when $(document).ready()
    socket.on("connected", function(data) {
        socket.user = data.user;

        if(!users[socket.user]) {
            users[socket.user] = new Set();
        }
        users[socket.user].add(socket);

        updateUsers();
    });

    // To update online users list
    function updateUsers() {
        io.emit("users", Object.keys(users));
    }
});

var port = Number(process.env.PORT || 8000);

http.listen(port, function() {
    console.log("Server running on 8000!");
});

但是,当我运行代码并转到控制台时,唯一返回的是:

Data: undefined
Data: undefined
Data: undefined

我该如何“修复”它?或者有没有更好的方法来做这个而不涉及PHP会话,只是与套接字本身及其功能?也许使用socket或express cookies?我还读到了Redis,如果它是一个不错的选择,我怎样才能调整我的代码来使用它呢?

1 个答案:

答案 0 :(得分:1)

如果您正在使用弹性beantalk,请考虑在负载均衡器上启用粘性会话。这将解决您的问题。还有一种使用socket.io适配器执行此操作的方法,但似乎不再维护socket.io-memcached lib。如果您想使用adapter,建议您切换到Redis。                     – mkhanoyan