RabbitMQ用于具有Express路由的NodeJS

我的服务器正在运行NodeJS,并使用amqplib api从另一个应用程序请求数据。 NodeJS服务器正在成功接收信息,但有一个明显的延迟,我试图确定我是否以最有效的方式做到这一点。 具体而言,我关心的是我打开和closures连接的方式。
项目布局
我有两个控制器文件处理接收和请求数据,request.img.server.controller.js和receive.img.server.controller.js。 最后,当前端button被按下时,路由处理控制器方法,即oct.server.routes.js。

request.img.server.controller.js

'use strict'; var amqp = require('amqplib/callback_api'); var connReady = false; var conn, ch; amqp.connect('amqp://localhost:5672', function(err, connection) { conn = connection; connReady = true; conn.createChannel(function(err, channel) { ch = channel; }); }); exports.sendRequest = function(message) { console.log('sending request'); if(connReady) { var ex = ''; var key = 'utils'; ch.publish(ex, key, new Buffer(message)); console.log(" [x] Sent %s: '%s'", key, message); } }; 

receive.img.server.controller.js

 var amqp = require('amqplib/callback_api'); var fs = require('fs'); var wstream = fs.createWriteStream('C:\\Users\\yako\\desktop\\binarytest.txt'); var image, rows, cols; exports.getResponse = function(resCallback) { amqp.connect('amqp://localhost:5672', function(err, conn) { conn.createChannel(function(err, ch) { var ex = ''; ch.assertQueue('server', {}, function(err, q) { console.log('waiting for images'); var d = new Date(); var n = d.getTime(); ch.consume(q.queue, function(msg) { console.log(" [x] %s: '%s'", msg.fields.routingKey, msg.content.toJSON()); rows = msg.content.readInt16LE(0); cols = msg.content.readInt16LE(2); console.log("rows = %s", msg.content.readInt16LE(0)); console.log("cols = %s", msg.content.readInt16LE(2)); image = msg.content; var currMax = 0; for (var i = 4; i < image.length; i+=2) { if (image.readInt16LE(i) > currMax) { currMax = image.readInt16LE(i); } wstream.write(image.readInt16LE(i) + ','); } console.log('done writing max is', currMax); //console.log(image); resCallback(rows, cols, image); }, { noAck: true }); }); }); }); }; 

oct.server.routes.js

 'use strict'; module.exports = function(app) { var request_img = require('../../app/controllers/image-tools/request.img.server.controller.js'); var receive_img = require('../../app/controllers/image-tools/receive.img.server.controller.js'); // oct routes app.get('/load_slice', function(req, res) { console.log('load slice hit'); receive_img.getResponse(function (rows, cols, image) { res.end(image); }); request_img.sendRequest('123:C:\\Users\\yako\\Documents\\Developer\\medicaldiag\\test_files\\RUS-01-035-09M-21.oct'); }); }; 

你打开连接的方式是不好的,至less是性能问题的一部分。

连接打开很昂贵。 他们在客户端和rabbitmq服务器之间的TCP / IP端口上打开一个新的TCP / IP连接。 这需要时间,并在客户端和服务器上占用有限的资源。

因此,应该在每个node.js进程中创build并使用到RabbitMQ的单个连接。 这个连接应该被该进程中的所有代码共享。

无论何时您需要使用RabbitMQ做一些事情,都可以在共享连接上打开一个新频道,然后开始工作。 频道很便宜,可以根据需要在连接中打开和closures。

更具体地说,在你的代码中, receive.img.server.controller.js文件是主要的问题。 每次调用getResponse方法时,这将打开一个到RabbitMQ的新连接。

如果您有10个用户访问该站点,那么您将有10个打开的RabbitMQ连接,只要1个就足够了。 如果您有成千上万的用户访问该站点,那么您将拥有数千个打开的RabbitMQ连接,只要1个就足够了。 您还有可能在RabbitMQ服务器或客户端上耗尽可用的TCP / IP连接。

您的receive.img.server.controller.js应该更像您的request.img.server.controller.js – 一个连接打开,并且一直重复使用。


另外,FWIW – 我推荐使用RabbitMQ w / node.js 的wascally库 。 这个库位于amqplib之上,但是使事情变得更容易。 它将为您pipe理您的一个连接,并使您更容易发送和接收消息。

我还有一些培训材料可用于RabbitMQ和node.js ,涵盖了amqplib的基础知识,然后转入使用wascally进行真正的应用程序开发。