aws FIFO队列返回空队列,即使它有可用的消息

时间:2018-05-19 20:08:33

标签: node.js aws-lambda amazon-sqs fifo

我有一个FIFO队列,可用的消息超过2 mil。 我想用lambda函数处理它们,但是在我调查消息的10次中有9次我收到队列为空的回复。这绝对不是真的。我试图改为长期民意调查,但它没有帮助。 这是我的轮询消息代码。

import { create as listenToSqsQueue } from "sqs-consumer";

listenToSqsQueue({
    queueUrl: Config.aws.sqsurl,

    handleMessage: async function (message, done){
        // do some work with `message`s
        Promise.resolve(invokePoller(functionName, message, callback));
        done();
      }
    ,         
    batchSize: 10
}).on("empty", function() {
    callback(undefined, "Queue is empty");
}).on("error", function(error: Error, message: any) {
    console.error(error, message);
    callback(error)
}).start();

2 个答案:

答案 0 :(得分:2)

我建议你尝试一个小测试,如下面的步骤,自己理解FIFO队列的这种行为。

  1. 为测试目的创建FIFO队列
  2. 向队列发送两条消息
  3. 调用队列的receive-message API。您应该收到您输入队列的第一条消息
  4. 多次调用receive-message API,对于后续尝试,您会收到空响应。 30秒后(可见性超时),如果您调用receive-message API,您将收到相同的消息。但是,您永远不会从队列中收到第二条消息。
  5. 删除在步骤3
  6. 中收到的消息
  7. 调用receive-message API,您应该会收到您发送到队列的第二条消息
  8. 您的队列使用者收到接收消息API的空响应的原因是队列使用者在处理后没有删除收到的消息。如果您的FIFO队列在未传输已传递的消息时传递了其他消息,则可能违反"First-In-First-Out Delivery"的保证。因为可以在处理第一条消息之前处理第二条消息。如果考虑有多个队列使用者的情况,这种行为会变得更加明显。

    在摘要中,我建议您考虑将消息删除为FIFO队列的通知,以指示队列使用者已成功处理该消息,并允许FIFO队列在队列中传递下一条消息。要修复客户端代码,您可以修改它以在成功处理后删除该消息。

答案 1 :(得分:0)

作为@Denis Weerasiri提出的解决方案的替代解决方案,您可以为每个消息设置一个不同的消息组ID,以便可以解决适用于同一组中消息的FIFO限制。

请参阅AWS文档中的Using the Amazon SQS message group ID