gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 22:46:53 24 4
gpt4 key购买 nike

我实际上正在尝试使用 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);
});
});

});
});
});
})()

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

最佳答案

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

您的用户轮流接收消息的原因是 RabbitMQ 尝试将传入消息的负载均匀地分布在用户之间。

您的问题之前已得到解答here 。看看它是否能解决您的问题!

关于node.js - Node-amqp 和 socket.io 奇怪的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28833068/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com