节点与amqp的并发性

时间:2017-02-18 11:33:55

标签: node.js concurrency amqp node-amqp

我正在编写一个节点js服务,它使用rabbitmq接收消息。但是当我尝试将并发请求发送到我的节点js服务时,我遇到了一个问题。

这是我写过的amqp订阅者,

const amqp = require('amqplib/callback_api')
let AmqpConnection = {
  // some other methods to make connection
  // ....
  //....



  subscribe: function(){
    this.withChannel((channel) => {
      let defaultQueueName = "my_queue";

      channel.assertQueue(defaultQueueName, { durable: true }, function(err, _ok) {
        if (err) throw err;
        channel.consume(defaultQueueName, AmqpConnection.processMessage);
        Logger.info("Waiting for requests..");
      });
    })       
  },

  processMessage: function(payload){
    debugger
    try {
      Logger.info("received"+(payload.content.toString()))
    }
    catch(error){
      Logger.error("ERROR: "+ error.message)
      //Channel.ack(payload)
    }
  }
}

现在我正尝试使用发布商

向其发布消息
const amqp = require('amqplib/callback_api')
let Publisher = {
  // some other methods to make connection
  // ....
  // ....

  sendMessage: function(message){

    this.withChannel((channel) => {

      let exchangeName = 'exchange';
      let exchangeType = 'fanout';
      let defaultQueueName = 'my_queue';
      channel.assertExchange(exchangeName, exchangeType)
      channel.publish(exchangeName, defaultQueueName, new Buffer(message));
    })
  }
}

let invalidMsg = JSON.stringify({ "content": ""})
let correctMsg = JSON.stringify({ "content": "Test message"})


setTimeout(function () {
  for(let i=0; i<2; i++){
    Publisher.sendMessage(correctMsg)
    Publisher.sendMessage(invalidMsg)
  }
}, 3000)

但是当我执行发布者和订阅者时,我会在订阅者端获得以下输出

2017-02-18T11:27:55.368Z - info: received{"content":""}
2017-02-18T11:27:55.378Z - info: received{"content":""}
2017-02-18T11:27:55.379Z - info: received{"content":""}
2017-02-18T11:27:55.380Z - info: received{"content":""}

似乎并发请求覆盖了收到的消息。有人可以在这帮忙吗?

0 个答案:

没有答案