Node.js应用程序侦听消息队列并异步向redis添加消息

时间:2017-02-14 09:07:16

标签: node.js redis activemq

我正在开发一个侦听消息队列(ActiveMQ)的node.js组件,并将收到的消息批量添加到redis中(每批必须为20个)。

从ActiveMQ收到的消息数量是每秒10次或更少时没有问题。

我的问题是消息每4毫秒被添加到队列中。这导致批次中添加的记录数有时超过每批20个。

const stompit = require('stompit');
var uuid = require('node-uuid');
var Redis = require('ioredis');

var redis = new Redis();
var pipeline = redis.pipeline();
var batchCounter = 0;

stompit.connect({ host: 'localhost', port: 61613 }, function(err1, client) {

client.subscribe({ destination: 'MyQueue' }, function(err2, msg) {
    msg.readString('UTF-8', function(err3, body) {

        if (batchCounter >= 20){
            pipeline.exec(function(err4, results) {
                pipeline = redis.pipeline();
                batchCounter = 0;
                console.log(results);
            });
        }

        batchCounter++;
        pipeline.set(uuid.v1(), JSON.stringify(body));
        //client.disconnect();
      });
  });
  });

如何解决这个问题? 谢谢

2 个答案:

答案 0 :(得分:0)

尝试在调用.exec方法之前重置管道,我假设这是一种异步方法。由于.exec将来会在某个时间点运行,因此增量和pipeline.set可以在它之前运行。

以下代码保存当前管道并在.exec

之前同步创建一个新管道
if (batchCounter >= 20){
    let fullpipeline = pipeline;
    pipeline = redis.pipeline();
    batchCounter = 0; 
    fullpipeline.exec(function(err4, results) {
        console.log(err4, results);
    });
}

然后,新邮件应该只附加到新管道。

答案 1 :(得分:0)

我最终使用标志控制每批记录的数量。我相信还有另一种可能的,可能更有效的解决方案,它控制从ActiveMQ读取的过程。但是,在这种情况下,旗帜为我做了工作。使用标志的完整代码位于以下链接中:

https://github.com/TamerB/ToActiveMQToRedis/blob/master/consumer/app.js