Рабочий процесс AWS Elastic Beanstalk оставляет сообщение SQS в полете - PullRequest
0 голосов
/ 08 мая 2019

У меня есть среда рабочего уровня NodeJS Elastic Beanstalk, которая принимает сообщения из очереди SQS и отправляет их на внешний URL-адрес.Код ниже работает, как и ожидалось, но сообщение остается «в полете» в SQS.Я не вижу никакой документации о том, как сообщить SQS, что сообщение успешно обработано?

var http = require('http'),
    request = require("request"),
    fs = require('fs');

http.createServer(function (req, res) {

    req.on('data', function (data) {
        var jsonObj = JSON.parse(data);
        var jsonString = JSON.stringify(jsonObj);

        log("Processing " + jsonString);

        request.post('http://example.com', {
            json: true,
            body: jsonString,
            headers: {  
                "content-type": "application/json",
            }
        }, (error, res, body) => {
            if (error) {
                log(`Error ${error}`);
                return;
            }

            returnResponse(res, JSON.stringify(body));
        })
    });
}).listen(process.env.PORT || 3000);

function returnResponse(httpResponse, message) {
    log(`Response status code  ${httpResponse.statusCode} - ${message}`);
    httpResponse.writeHead(httpResponse.statusCode);
    httpResponse.write(message);
    httpResponse.end();
}

var log = function (entry) {
    fs.appendFileSync('/tmp/output.log', new Date().toISOString() + ' - ' + entry + '\n');
};  

Ответы [ 2 ]

1 голос
/ 08 мая 2019

Сообщение, являющееся в полете означает, что оно было получено потребителем, но еще не удалено из очереди.Если он не будет удален потребителем во время ожидания видимости очереди, он снова будет помещен в очередь SQS.

Вы должны удалять сообщения из очереди, если вы успешно их обработали.Если вы знакомы с AMQP 0-9-1, это действие похоже на подтверждение сообщений .

Поскольку вы используете Node.js, этот - это метод из официального SDK, который вы должны использовать для достижения своей цели.

0 голосов
/ 08 мая 2019

Это фиксированный код:

var http = require('http'),
    request = require("request"),
    fs = require('fs');

http.createServer(function (req, res) {

    req.on('data', function (data) {
        var jsonObj = JSON.parse(data);
        var jsonString = JSON.stringify(jsonObj);

        log("Processing " + jsonString);

        request.post('http://example.com', {
            json: true,
            body: jsonString,
            headers: {  
                "content-type": "application/json",
            }
        }, (error, response, body) => {
            if (error) {
                log(`Error ${error}`);
                return;
            }

            returnResponse(res, response.statusCode, JSON.stringify(body));
        })
    });
}).listen(process.env.PORT || 3000);

function returnResponse(res, statusCode, message) {
    log(`Response status code  ${statusCode} - ${message}`);
    res.writeHead(statusCode, {'Content-Type': 'text/plain'});
    res.write('Complete');
    res.end();
}

var log = function (entry) {
    fs.appendFileSync('/tmp/sample-app.log', new Date().toISOString() + ' - ' + entry + '\n');
};

С https://www.edureka.co/blog/aws-elastic-beanstalk/

Демон извлекает запросы, отправленные из очереди Amazon SQS. В зависимости от приоритета очереди SQS отправит сообщение через запрос POST на HTTP-путь рабочей среды. Рабочий при получении сообщения выполняет задачи и отправляет HTTP-ответ после завершения операции. SQS при получении ответного сообщения удаляет сообщение в очереди. Если он не получит ответ, он будет постоянно повторять отправку сообщений.

Проблема заключалась в том, что мой предыдущий код неправильно возвращал код состояния http.

...