【问题标题】:sqs.recieveMessage not receiving even when messages in queuesqs.recieveMessage 即使在队列中的消息也没有收到
【发布时间】:2018-06-27 23:35:32
【问题描述】:

所以我有 3 个 lambda,其中一个带有触发 lambda 的 API 事件,该 lambda 下拉大约 50,000 个对象并将它们全部推送到队列中。

第二个 lambda 从队列中读取,一次 10 个,循环 30 次 - 这意味着它读取、执行操作、调用第三个 lambda、返回 promise,然后再次读取 - 30 次,总共 300 次读取lambda 执行的时间

第三个 lambda 从队列中获取信息并用它到达另一个端点。

问题在于第二个 lambda...首先我调用一个函数,该函数返回队列中的消息数,如果它大于零,我会读取它们。但是,即使队列中有 20,000 条消息,它也经常会一无所获。我不知道为什么。

我将 WaitTimeSeconds 设置为 20 进行长轮询。任何帮助将不胜感激,文档声称我可以使用 FIFO 队列读取高达 3,000/秒的数据,但我无法获得接近该性能的任何地方。

代码如下:

exports.handler = (event, context, callback) => {
  const sqs = new AWS.SQS({ region: process.env.AWS_REGION });
  getMessageCount(sqs)
    .then((messageCount) => {
      if (messageCount > 0) {
        mapSeries(range(0, 30), getMessages(sqs))
          .then((messageRes) => {
            callback(null, messageRes);
          })
          .catch(e => Promise.reject(e));
      }
      callback(null, 'No more messages');
    })
    .catch((e) => {
      callback(e);
    });
};

getMessageCount 调用sqs.getQueueAttributes 并返回一个接收消息数量的承诺。

mapSeries 允许循环在迭代之前等待先前的承诺被解析/拒绝,并且在每次迭代中它调用 getMessages 调用 sqs.receiveMessage 并使用数据调用第三个 lambda。

感谢您对此的任何看法,谢谢!

【问题讨论】:

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


    【解决方案1】:

    据我了解,问题在于获取队列中的消息数量。如果您还提供了getMessageCount(sqs),我们可以确定您尝试从 SQS 检索的属性类型。

    共有三种相关的属性,用于获取 SQS 中的消息计数。下面给出了这些属性。

    ApproximateNumberOfMessages - 返回可见的近似数量 队列中的消息

    ApproximateNumberOfMessagesNotVisible - 返回未超时且未删除的消息的大致数量。

    如果要包含等待添加的消息,也可以考虑以下属性。

    ApproximateNumberOfMessagesDelayed - 返回大约 等待添加到队列中的消息。

    通过考虑这些属性,您可以从 SQS 获得更准确的计数。

    另外,如果我可以建议,我实现了一个类似的系统,但没有查找计数。我通过轮询一次检索 10 条消息,处理它们并将它们从队列中删除。根据您的示例,您可以重复此操作 30 次。但是如果getMessages(sqs) 函数返回一个空集,我们可以假设该列表是空的。 (这取决于您使用的是短轮询还是长轮询)。然而,在每一步检查消息的数量似乎是多余的。这是根据此示例,但可能会根据用例有所延迟。

    【讨论】:

    • 我正在使用长轮询,消息为 not 为空,因为 getMessages 返回一个非常大的数字,并在从 getMessages 函数返回一个空集之前立即将其注销。跨度>
    【解决方案2】:

    通读 API 文档:https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/SQS.html#receiveMessage-property

    参数:

    MaxNumberOfMessages —(整数)

    要返回的最大消息数。 Amazon SQS 永不返回 比此值更多的消息(但是,可能会出现更少的消息 回来)。有效值为 1 到 10。默认值为 1。

    将您的代码包装在一个 while 循环中,并预计 0 条消息的常见情况,因为 0 小于 1 到 10。

    类似...

    var messages = [];
    while(messages.length < NUMBER_OF_MSGS_YOU_REALLY_WANT) {
    
        var new_messages = await getSQSMessages(NUMBER_OF_MSGS_YOU_REALLY_WANT - messages.length);
        if(new_messages.Data.Messages.length > 0) { 
           messages.push(new_messages.Data.Messages);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2018-05-04
      • 2014-05-05
      • 1970-01-01
      • 2014-05-19
      • 2021-09-24
      • 2016-02-02
      • 2014-02-25
      • 1970-01-01
      • 2018-05-27
      相关资源
      最近更新 更多