Node-amqp 和 socket.io 奇怪的行为

Posted

技术标签:

【中文标题】Node-amqp 和 socket.io 奇怪的行为【英文标题】:Node-amqp and socket.io strange behaviour 【发布时间】:2015-05-04 04:17:35 【问题描述】:

我实际上是在尝试使用 node-amqp (https://github.com/postwait/node-amqp) 来实现 pub/sub 模式。

我在实现它时遇到了一些问题。

我需要什么:

发布来自用户的消息 广播给其他用户 将消息发送给离线用户,他们将在下次连接时使用它

我的实际情况:

(function () 

    var amqp = require('amqp');

    var connection = amqp.createConnection( host: 'http://127.0.0.1:5672/' );
    var app = require('express')();
    var server = require('http').Server(app);
    var io = require('socket.io')(server);

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

    server.listen(8888);

// Wait for connection to become established.


    connection.on('ready', function () 

        var sendMessage = function (queue, msg) 
            connection.publish(queue, JSON.stringify(msg));
        


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

            socket.on('message', function (msg) 
                sendMessage('my-queue', msg);
            );

            connection.queue('my-queue', autoDelete: false, function (q) 
                q.bind('#');

                q.subscribe(function (message) 
                    socket.broadcast.emit('news',message);
                );
            );

        );
    );
)()
在 index.html 页面上,我连接到套接字服务器 我有一个发送消息的按钮 我在索引页面上打开了两个不同的浏览器,我的用户都已连接 如果我向服务器发送消息,它会将其发送给其他用户 如果我向服务器发送第二条消息,它会将消息发送给发送消息的用户。

正在切换,每对消息(因为我有两个用户),其他用户收到消息,如果是损坏消息,当前发送消息的用户收到消息。 这是什么行为?

你能帮我更正我的代码以实现我的需求吗?

注意:我在 Windows 7 x64 计算机上使用带有标准配置的 RabbitMQ

编辑:我提出了一个解决方案,每个消费者都可以通过以下方式获得消息:

(function () 

    var amqp = require('amqp');

    var connection = amqp.createConnection( host: 'http://127.0.0.1:5672/' );
    var app = require('express')();
    var server = require('http').Server(app);
    var io = require('socket.io')(server);

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

    server.listen(8888);

// Wait for connection to become established.


    connection.on('ready', function () 


        connection.exchange('logs', type: 'fanout', autoDelete: false, function (exchange) 

            var sendMessage = function (queue, msg) 
                exchange.publish(queue, JSON.stringify(msg));
            

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

                socket.on('message', function (msg) 
                    sendMessage('', msg);
                );

                connection.queue(socket.id, exclusive: true, function (q) 
                    q.bind('logs', '');

                    q.subscribe(function (message) 
                        socket.emit('news', message);
                    );
                );

            );
        );
    );
)()

我的最后一个问题是我现在无法管理离线消息...有什么解决方案吗? (赏金明天结束:-/)

【问题讨论】:

【参考方案1】:

问题是 RabbitMQ 会故意将每条消息发送给单个用户。该用户确认它收到了消息 (amqp does this for you automatically),然后就 RabbitMQ 而言,工作已完成,因此它会删除该消息。

您的用户轮流接收消息的原因是 RabbitMQ 试图将传入消息的负载平均分配给用户。

您的问题已在here 之前得到解答。查看它以解决您的问题!

【讨论】:

【参考方案2】:

您需要为每个消费者(在您的情况下为用户)创建单独的队列,并将消息从交换路由到所有消费者。这样,当您发布消息时,它将被放置在所有用户的队列中,每个用户都可以独立地使用它。

你有这个: http://www.rabbitmq.com/tutorials/tutorial-two-python.html

你需要这个: http://www.rabbitmq.com/tutorials/tutorial-three-python.html

【讨论】:

感谢您的帮助。我现在遇到了一个关于离线数据的问题……你能帮帮我吗?我编辑了我的帖子

以上是关于Node-amqp 和 socket.io 奇怪的行为的主要内容,如果未能解决你的问题,请参考以下文章

io.emit 与 socket.emit

Socket.IO 连接用户数

控制字符的 Socket.IO 问题

Socket.io 多连接

安装 socket.io 时 SocketIO.Server 对象消失

Socket.io 不会在断开连接时向房间发送消息