Я пытаюсь написать рабочую интеграцию rsmq с redis + node + docker.
Я создал три отдельных контейнера
- производитель
- redis
- потребитель
Все три контейнера работают на одном компьютере (localhost
).Когда я собираюсь отправить сообщение в очередь redis из контейнера-производителя, оно работает успешно, но потребитель не может автоматически извлечь сообщение из этой же очереди.
Однако я прошел все три контейнера ипроверенная конфигурация сети.Это make ping. Я использовал rsmq-worker в качестве потребителя redis.
К моему удивлению, он работает в следующих двух сценариях
Я переместил своего потребителя в тот же контейнеркак контейнер REDIS и тянет сообщение.Однако, как я уже говорил, когда потребитель находится в отдельном контейнере, чем REDIS, он не работает.
Также, когда у меня есть три отдельных контейнера, и я использую 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);
}
});
});