【问题标题】:Check for an incoming message in aws sqs检查 aws sqs 中的传入消息
【发布时间】:2017-05-29 13:47:28
【问题描述】:

我的函数如何持续检查传入消息?收到消息后,以下函数退出。考虑到队列已启用长轮询,我如何不断检查新消息?

function checkMessage(){
    var params = {
                QueueUrl : Constant.QUEUE_URL,
                VisibilityTimeout: 0,
                WaitTimeSeconds: 0
            }
    sqs.receiveMessage(params,(err,data) => {
        if(data){
            console.log("%o",data);
        }
    });
}

【问题讨论】:

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


    【解决方案1】:

    (function checkMessage(){ var params = { QueueUrl : Constant.QUEUE_URL, VisibilityTimeout: 0, WaitTimeSeconds: 0 } sqs.receiveMessage(params,(err,data) => { if(data){ console.log("%o",data); } checkMessage() }); })()

    要持续检查您的 aws sqs 中的传入消息,您需要在返回数据时递归调用 aws sqs。

    【讨论】:

    • 请描述一下,问题是什么,这个sn-p将如何解决它,以帮助其他人理解这个答案
    【解决方案2】:
    var processMessages = (function (err, data) {
        if (data.Messages) {
    
            for (i = 0; i < data.Messages.length; i++) {
                var message = data.Messages[i];
                var body = JSON.parse(message.Body);
    
                // process message
                // delete if successful
            }
        }
    });
    
    while (true) {
        sqs.receiveMessage({
            QueueUrl: sqsQueueUrl,
            MaxNumberOfMessages: 5, // how many messages to retrieve in a batch
            VisibilityTimeout: 60,  // how long until these messages are available to another consumer
            WaitTimeSeconds: 15     // how many seconds to wait for messages before continuing 
        }, processMessages);
    }
    

    【讨论】:

    • 这不会让 nodejs 应用程序永远处于循环中吗?
    • 它的目的是作为说明性代码来完全回答“我如何不断检查”。在这种情况下,每次迭代最多会等待 15 秒。当然,如果这对您的用例更有效,您可以使用具有有限迭代的 for 循环。您可能还更喜欢 Elastic Beanstalk 工作线程来处理您的 SQS 消息:docs.aws.amazon.com/elasticbeanstalk/latest/dg/…
    【解决方案3】:

    您的函数需要不断轮询 Amazon SQS。

    Long Polling 如果没有可用的消息,最多会将响应延迟 20 秒。如果在此期间有消息可用,将立即返回。如果 20 秒后没有消息,则返回而不提供消息。

    因此,您的函数需要再次轮询 SQS(可能同时执行其他操作)。

    【讨论】:

    • 我应该定期调用相同的函数吗?
    • 是的。根据您需要多快处理消息,您可以每分钟甚至每五分钟调用一次。这是你的选择。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-22
    • 2018-02-11
    • 2021-04-08
    • 2017-05-29
    • 2019-11-11
    • 2018-12-23
    相关资源
    最近更新 更多