gpt4 book ai didi

node.js - aws FIFO 队列返回空队列,即使它有可用消息

转载 作者:行者123 更新时间:2023-12-02 16:41:40 25 4
gpt4 key购买 nike

我有一个 FIFO 队列,其中有超过 200 万条可用消息。我想用 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();

最佳答案

我建议您尝试按照以下步骤进行一个小测试,以了解 FIFO 队列的这种行为。

  1. 创建用于测试目的的 FIFO 队列
  2. 向队列发送两条消息
  3. 调用队列的接收消息API。您应该会收到进入队列的第一条消息
  4. 多次调用接收消息 API,并且在后续尝试中,您会得到空响应。 30 秒(可见性超时)后,如果您调用接收消息 API,您将收到相同的消息。但是,您永远不会收到队列中的第二条消息。
  5. 删除您在第 3 步中收到的消息
  6. 调用接收消息 API,您应该会收到发送到队列的第二条消息

您的队列使用者收到接收消息 API 的空响应的原因是队列使用者在处理收到的消息后尚未删除该消息。如果您的 FIFO 队列传送了其他消息,而已传送的消息未被删除,则可能违反 "First-In-First-Out Delivery" 的保证。因为第二条消息可以在第一条消息处理之前处理。如果考虑有多个队列使用者的情况,这种行为会变得更加明显。

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

关于node.js - aws FIFO 队列返回空队列,即使它有可用消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50429080/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com