【新手求学】nodejs+rabbitmq 使用amqp(或者amqplib问题一样) 出现瓶颈求解
发布于 1年前 作者 gaizhi 2289 次浏览

【内容描述】:用nodejs做生产者发布消息到另外一台的rabbitmq服务器上(重点是rabbitmq在另外一台计算机上)。 【目标】: message为一个4k的文本,最短时间发送10万个message。 【现象】: 1.在message为4k,一次性for循环publish 4万个以内,速度很快完成,cpu使用很低,只会在for循环时高一点(很短),但是,超过5万速度明显慢的比蜗牛还慢,cpu使用率高(几乎满掉),而且很久,速度直到publish回调函数成功完成到剩下的在四万个以内才会有变高,cpu使用率降低。 2.在message很小,就几字节的时候,for循环publish 10万或者20万,没有任何差别,速度高效。 3.上诉情况如果rabbitmq服务器在本地与nodejs生产者在同一台电脑,无论message大小为那种情况,都不会有问题,速度比远程调用速度快上六七倍。

【我的问题】:为什么当message为4k,rabbitmq在远程(另一台电脑上)会有一个5万的界限(即在这个界限两边速度差距这么大)?如何解决这个问题?求大神讲解?在线等…

【代码】: var amqp = require(“amqp”); var fs = require(‘fs’); var exchName = "topic"; //exhange 名称 var routeKey = "topic"; // 路由键

var connOptions = { host: ‘192.168.65.170’ , port: 5672 , login: ‘guest’ , password: ‘guest’ , authMechanism: ‘AMQPLAIN’ , vhost: ‘/’ , ssl: { enabled : false } }

var exchOption = { type: ‘topic’ ,durable: true ,autoDelete: false ,confirm: false }

var messOption = { contentEncoding: “utf-8” ,deliveryMode: 1 }

var message = fs.readFileSync(‘2.txt’).toString(‘utf-8’); var conn = amqp.createConnection(connOptions); //连接rabbitmq var n=100000; // 循环数

var messFunc = function(e){ }

var exchFunc = function(exchange){ now = new Date(); mill = now.getMilliseconds(); console.log(now,mill); //[此处是我问题的点] for (var i = 0; i <n; i++) { exchange.publish(routeKey,new Buffer(message),’’,messFunc); //发布消息 因为exchange属性confirm为false,此处不会回调messFunc } now = new Date(); mill = now.getMilliseconds(); console.log(now,mill); }

var connFunc = function(){ console.log(“ready”); var exch = conn.exchange(exchName,exchOption,exchFunc); //获取exchange 生成生产者 }

conn.on('ready’,connFunc); //rabbitmq连接成功调用connFunc

10 回复

@snoopy 吴老师求解答

我所说的速度慢,实在rabbimq检测到的消息接收到的速度

更新:此情况只会在windows系统下存在,在linux系统下就没有了~~

是不是windows的端口号耗尽,新的连接需要等新空出来的端口号的原因?

node http默认用了连接池,把它关掉可能会好些(agent:false)。

@SoftICE 这个我在linux调优后的系统下也只有6.4万个端口可用,10万条消息完全不会出现这个情况。而且在windows下面如果消息是一小段的buffer也不会由此问题…所以排除端口问题。

在linux下面直接100兆带宽直接跑满一点不剩…可能是系统的堆栈实现原理不同导致的吧。其实很想知道真正原因。

我测试了下貌似没有问题,我的环境如下: 3台linux+一台负载 ,配置不高,分别2G内存的虚拟机,镜像模式+持久化,客户端使用amqp.node

  • 第一次测试

每次发送5K消息打开channal 发送后关闭,发送80000 ,非常慢 ,每秒publish 20左右,等不起直接kill :( !!! ![第一次测试](http://d.pcs.baidu.com/thumbnail/6df9d19b6206e00e6e898e7ff0feb2ae?fid=2183602240-250528-229854399&time=1385520220&sign=FDTAER-DCb740ccc5511e5e8fedcff06b081203-ast2pYYt0F%2BrGMTEciuY5%2FWmk2c%3D&rt=sh&expires=8h&r=363038880&sharesign=unknown&size=c850_u580&quality=100"Optional title")

  • 第二次测试一次连接后循环发送10000, 共发送12万左右 5K ,结果如下:

( !!! !二er次测试](http://d.pcs.baidu.com/thumbnail/6bfe88de3371748a4b4dfb23bc01db13?fid=2183602240-250528-2972554457&time=1385520220&sign=FDTAER-DCb740ccc5511e5e8fedcff06b081203-qwenkVuf8IMFxnz5be75P8iOW%2F0%3D&rt=sh&expires=8h&r=392707045&sharesign=unknown&size=c850_u580&quality=100"Optional title")

回复内容无法修改??? 啊!!!

我最近也在用rabbitmq+node.js,很想和楼主讨论一下这方面的问题,呵呵

回到顶部