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

我实际上试图使用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页面上,我连接到套接字服务器
  • 我有一个发送消息的button
  • 我在索引页上打开了两个不同的浏览器,我的用户都连接了
  • 如果我发送消息到服务器,它将其发送给其他用户
  • 如果我向服务器发送第二条消息,它将消息发送给发送消息的用户。

它是交换,每对消息(因为我有两个用户),其他用户得到的消息,如果是有害的消息,当前用户发送消息接收消息。 这是什么行为?

你能帮我纠正我的代码来实现我的需要一个好方法吗?

注意:我在Windows 7 x64计算机上使用标准configuration的RabbitMQ

编辑:我做了一个解决scheme,每个消费者可以得到的消息:

 (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); }); }); }); }); }); })() 

我最后的问题是我现在无法pipe理离线消息…任何解决scheme? (赏金结束明天: – /)

问题是RabbitMQ将故意将每条消息发送给单个用户。 该用户确认收到了该消息( amqp会自动为您执行此操作 ),然后就RabbitMQ而言完成该工作,因此将删除该消息。

您的用户轮stream接收消息的原因是,RabbitMQ试图将传入的消息均匀分散到用户上。

你的问题已经在这里回答。 检查出来解决您的问题!

您需要为每个消费者(在您的案例 – 用户)创build单独的队列,并将消息从交换路由到所有消息队列。 这样,当你发布消息时,它将被放置在所有用户的队列中,每个队列中的每个队列将能够独立使用它。

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

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