增加amqp.js中的max_frame速率 - 达到缓冲区副本中的限制

时间:2012-02-08 03:01:47

标签: node.js amqp

我有一种情况,我在50'直接'交易所有大约50名听众。客户端和服务器是javascript(node.js)。它使用来自postwait的node-amqp。 事情在低频率的消息中运作得相当好。一旦消息频率每分钟增加〜5000条消息,则amqp.js中会显示缓冲区复制错误 根据我的追踪,amqp.js中的max_frame_size固定为 131072

我只是尝试将值从128k加倍到256k。但这样做会导致node.js在没有启动的情况下静默失败。没有错误消息。我假设我还必须更改rabbit.config文件中的相应值(max_frame)。

我是否必须做任何其他事情来增加此值。任何其他建议也将不胜感激。

我附上了最小的代码来模拟错误。在2个窗口中运行以下命令以模拟错误

node engine-so-client.js -c 200 -p 12000

节点服务器-so.js

文件 server-so.js

var util= require('util')
var amqp = require('amqp');
var express = require ('express')


function httpServer(exchange) {
   console.log("In httpServer start  %s",exchange.name);
   var port;
   app = express.createServer();

   app.get('/message/:routingKey/:message',function(req,res) {
    exchange.publish(req.params.routingKey,{'d' : req.params.message});
    res.send('Published the message '+req.params.message+'\n');
});

app.get('/register/:socket/:routingKey',function(req,res) {
    var queue1 = conn.queue('',
            {autoDelete: false, durable: true, exclusive: true},
            function() {
                    console.log("Queue1 Callback");
                    queue1.subscribe(
                    function(message) {
                            console.log("subscribe Callback for "+req.params.routingKey + " " + message.d);
                    });
                    console.log("Queue Callback Binding with "+req.params.routingKey);
                    queue1.bind(exchange.name,req.params.routingKey);
            });
    res.send('Started the socket at '+req.params.socket+'\n');
   });

   app.listen(3000);
   app.use(express.logger());
   console.log('Started server on port %s', app.address().port);
   }

   function setup() {
      console.log("Setup");
      var exchange = conn.exchange('cf2-demo',
    {'type': 'direct', durable: false}, function() {
    var queue = conn.queue('',
            {autoDelete: false, durable: true, exclusive: true},
            function() {
                    console.log("Queue Callback Binding with test key");
                    queue.bind(exchange.name,'testKey');
            });
                    queue.on('queueBindOk',
                            function() { httpServer(exchange); });
   });

   console.log("Completed setup %s", exchange.name);
   }
   var conn = amqp.createConnection({host:'localhost',
                                    login:'guest',
                                    password:'guest'},
                             {defaultExchangeName: "cf2-demo"});
   conn.on('ready',setup);

文件 engine-so-client.js

var program = require('commander.js');
var util = require('util');
var http = require('http');

program
    .version('0.0.1')
    .option('-h, --host <host>', 'Host running server', String,'localhost')
    .option('-p, --port <port>', 'Port to open to connect messages on',Number,12000)
    .option('-k, --key <key>,',  'Routing Key to be used',String,'key1')
    .option('-c, --count <count>','Iteration count',Number,50)
    .option('-m, --mesg <mesg>','Message prefix',String,'hello')
    .option('-t, --timeout', 'Timeout in ms between message posts')
    .parse(process.argv);

function setup(host,port,key,mesg) {
  var client = http.createClient(3000, host);
  var request = client.request('GET','/register/'+port+"/"+key);
  request.end();
  request.on('response', function(response) {
    response.on('data', function(chunk) {
                    postMessage(host,port,key,mesg,1);
            });
  });
 }

 function postMessage(host,port,key,mesg,count) {
    var timeNow = new Date().getTime();
    var mesgNow = mesg+"-"+count+"-"+port;
    console.log("Type: Sent Mesg, Message: %s, Time: %s",mesgNow,timeNow);
    var client1 = http.createClient(3000, host);
    var request1 = client1.request('GET','/message/'+key+"/"+mesgNow);
    request1.end();
    count++;
    if (count <100) {
       setTimeout( function() { postMessage(host,port,key,mesg,count); }, 1000 );
    }
  }
  var port = program.port;
  var host = program.host;
  var key = program.key;
  var mesg = program.mesg;
  var count = program.count;
  var keys = ['key1','key2','key3','key4','key5'];
  var messages = ['hello','world','good','morning','bye'];
  var start=port;
  for (i=0; i<count; i++) {
      var index = i%keys.length;
      var socket = start + i;
      setup(host,socket,keys[index],messages[index]);
  }

附加错误

buffer.js:494
throw new Error('sourceEnd out of bounds');
      ^
Error: sourceEnd out of bounds
at Buffer.copy (buffer.js:494:11)
at frame (/home/hvram/programs/node_modules/node-amqp/amqp.js:170:10)
at header (/home/hvram/programs/node_modules/node-amqp/amqp.js:160:14)
at frameEnd (/home/hvram/programs/node_modules/node-amqp/amqp.js:205:16)
at frame (/home/hvram/programs/node_modules/node-amqp/amqp.js:172:14)
at header (/home/hvram/programs/node_modules/node-amqp/amqp.js:160:14)
at frameEnd (/home/hvram/programs/node_modules/node-amqp/amqp.js:205:16)
at frame (/home/hvram/programs/node_modules/node-amqp/amqp.js:172:14)
at header (/home/hvram/programs/node_modules/node-amqp/amqp.js:160:14)
at frameEnd (/home/hvram/programs/node_modules/node-amqp/amqp.js:205:16)

0 个答案:

没有答案