REDIS RSMQ Worker无法从Redis队列中获取消息



我试图用redis node docker编写RSMQ Worker集成。

我创建了三个独立的容器

  1. 生产者
  2. redis
  3. 消费者

所有三个容器都在同一台计算机上工作(localhost(。当我要从生产者容器中将消息发送给Redis队列时,它可以成功地工作,但消费者无法自动从同一队列中摘取消息。

但是,我已经浏览了所有三个容器并经过验证的网络配置。它是使ping。

令我惊讶的是,它在以下两个方案

中起作用
  1. 我将消费者移至与Redis容器相同的容器,并拉消息。但是,正如我提到的那样,当消费者在一个单独的容器中,而不是重新使用它。

  2. 当我有三个单独的容器时,我使用RSMQ-CLI并尝试RSMQ接收-H redis-ip -Q-Q Simple Test从消费者容器中,并且它获取消息

我相信RSMQ-WORKER与容器中存在一些问题。有人面对过吗?有什么建议吗?

我也正在附加代码以供参考。

消费者.js

var express = require('express');
var app = express();
var bodyParser = require('body-parser');
var RedisSMQ = require("rsmq");
var rsmq = new RedisSMQ({ host: "18.232.206.185", port: 6379, ns: "rsmq" });
var RSMQWorker = require("rsmq-worker");
var rsmqTestWorker = new RSMQWorker("simple-test", { timeout: '0' });
var router = express.Router();
var allowCrossDomain = function (req, res, next) {
    res.header('Access-Control-Allow-Origin', '*');
    res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE');
    res.header('Access-Control-Allow-Headers', 'Content-Type,userId,x-onehop-token,businessId,corporateId');
    if (req.method == 'OPTIONS') {
        res.status(200).end();
    } else {
        console.log("------------------Req URL-----------------");
        console.log("Req.URL :: ", req.path);
        console.log("------------------Req method-----------------");
        console.log("Req.params :: ", req.method);
        console.log("--------------------------------------------");
        next();
    }
    // next();
};
app.use(allowCrossDomain);
app.use(bodyParser.json({
    limit: '50mb'
}));
//app.use(bodyParser.json());
app.use(bodyParser.urlencoded({
    limit: '50mb',
    extended: true,
    parameterLimit: 100000000
}));
rsmqTestWorker.on("message", function(msg, next, id) {
    // process your message
    console.log("rsmqTestWorker process Message id : " + id);
    console.log(msg);
    next();
});
// optional error listeners
rsmqTestWorker.on('error', function(err, msg) {
    console.log("rsmqTestWorker ERROR", err, msg.id);
});
rsmqTestWorker.on('exceeded', function(msg) {
    console.log("rsmqTestWorker EXCEEDED", msg.id);
});
rsmqTestWorker.on('timeout', function(msg) {
    console.log("rsmqTestWorker TIMEOUT", msg.id, msg.rc);
});
var server = app.listen(5000, function () {
    console.log('Server listening on port 5000');
    rsmqTestWorker.start();
});

producer.js

var express = require('express');
var app = express();
var bodyParser = require('body-parser');
var RedisSMQ = require('rsmq');
var rsmq = new RedisSMQ({
    "host": '18.232.206.185',
    "port": 6379,
    ns: 'rsmq'
});
var allowCrossDomain = function (req, res, next) {
    res.header('Access-Control-Allow-Origin', '*');
    res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE');
    res.header('Access-Control-Allow-Headers', 'Content-Type,userId,x-onehop-token,businessId,corporateId');
    if (req.method == 'OPTIONS') {
        res.status(200).end();
    } else {
        console.log("------------------Req URL-----------------");
        console.log("Req.URL :: ", req.path);
        console.log("------------------Req method-----------------");
        console.log("Req.params :: ", req.method);
        console.log("--------------------------------------------");
        next();
    }
    // next();
};
app.use(allowCrossDomain);
app.use(bodyParser.json({
    limit: '50mb'
}));
//app.use(bodyParser.json());
app.use(bodyParser.urlencoded({
    limit: '50mb',
    extended: true,
    parameterLimit: 100000000
}));
app.get("/send-sms", (req, res) => {
    rsmq.sendMessage({ qname: "simple-test", message: "Hello World" }, function (err, resp) {
        if (resp) {
            console.log("Message sent. ID:", resp);
            res.status(200).send(JSON.stringify({ status: "success" ,resp:resp }));
        }
    });
});
var server = app.listen(4000, function () {
    console.log('Server listening on port 4000');
    rsmq.createQueue({
        qname: "simple-test",
        maxsize: -1
    }, function (error, resp) {
        if (resp === 1) {
            console.log("simple-test queue created");
        } else {
            console.log(error);
        }
    });
});
new RSMQWorker("simple-test", { timeout: '0' });

需要使用redis连接或rsmq实例进行,默认的redis主机为127.0.0.1,端口6379

它似乎是一个开发问题,而不是Docker问题。您是否在容器外尝试了2个微服务?

最新更新