AWS Elastic Beanstalk工作进程使SQS消息处于运行状态

时间:2019-05-08 14:06:08

标签: node.js amazon-web-services amazon-sqs amazon-elastic-beanstalk

我有一个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 个答案:

答案 0 :(得分:1)

正在投放的消息表示该消息已被消费者使用,但尚未从队列中删除。如果使用者在队列的可见性超时期间未将其删除,它将由SQS重新放回队列。

如果成功处理消息,则应从队列中删除它们。如果您熟悉AMQP 0-9-1,则此操作类似于确认消息

由于您使用的是Node.js,因此this是官方SDK中的方法,应使用它来实现目标。

答案 1 :(得分:0)

这是固定代码:

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状态代码。