【问题标题】:AWS Elastic Beanstalk worker process leaves SQS message in flightAWS Elastic Beanstalk 工作进程在飞行中留下 SQS 消息
【发布时间】:2019-09-26 07:14:56
【问题描述】:

我有一个 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');
};  

【问题讨论】:

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


【解决方案1】:

消息in flight意味着它已被消费者消费,但尚未从队列中删除。如果在队列的可见性超时期间没有被消费者删除,它将被SQS再次放回队列中。

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

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

【讨论】:

    【解决方案2】:

    这是固定代码:

    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 将通过 POSTrequest 将消息发送到 Worker Environment 的 HTTP 路径。收到消息的工作人员执行任务并在操作完成后发送 HTTP 响应。 SQS 在收到响应消息时删除队列中的消息。如果没有收到响应,它将不断重试发送消息。

    问题是我之前的代码没有正确返回 http 状态代码。

    【讨论】:

      猜你喜欢
      • 2017-10-01
      • 2020-01-11
      • 2018-02-11
      • 2019-01-22
      • 2015-09-18
      • 2021-08-22
      • 1970-01-01
      • 2017-07-03
      • 2023-03-26
      相关资源
      最近更新 更多