работник redis rsmq не может получить сообщение из очереди redis - PullRequest
0 голосов
/ 25 апреля 2018

Я пытаюсь написать рабочую интеграцию rsmq с redis + node + docker.

Я создал три отдельных контейнера

  1. производитель
  2. redis
  3. потребитель

Все три контейнера работают на одном компьютере (localhost).Когда я собираюсь отправить сообщение в очередь redis из контейнера-производителя, оно работает успешно, но потребитель не может автоматически извлечь сообщение из этой же очереди.

Однако я прошел все три контейнера ипроверенная конфигурация сети.Это make ping. Я использовал rsmq-worker в качестве потребителя redis.

К моему удивлению, он работает в следующих двух сценариях

  1. Я переместил своего потребителя в тот же контейнеркак контейнер REDIS и тянет сообщение.Однако, как я уже говорил, когда потребитель находится в отдельном контейнере, чем REDIS, он не работает.

  2. Также, когда у меня есть три отдельных контейнера, и я использую rsmq-cli и пробую rsmq получить -h redis-Ip -q simple-test из потребительского контейнера, и он получает сообщение

Я считаю, что в rsmq-worker есть проблема с контейнером.Кто-нибудь сталкивался с этим раньше?Любые предложения?

Я прилагаю код также для справки.

Consumer.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);
        }
    });
});

Ответы [ 2 ]

0 голосов
/ 11 мая 2018
new RSMQWorker("simple-test", { timeout: '0' });

Требуется init с подключением redis или экземпляром rsmq, по умолчанию хост redis 127.0.0.1 с портом 6379

0 голосов
/ 25 апреля 2018

Кажется, это проблема разработчика вместо проблемы Docker. Вы пробовали свои 2 микросервиса вне контейнера?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...