AWS SQS FIFO短轮询receiveMessage不返回任何消息



我的代码很简单:

const params = {
AttributeNames: [
'All',
],
MaxNumberOfMessages: 10,
MessageAttributeNames: [
'All',
],
QueueUrl: SQS_QUEUE_URL,
VisibilityTimeout: 20,
WaitTimeSeconds: 10,
}

const messages = await SQS.receiveMessage(params).promise();
console.log({messages});

然而,除非WaitTimeSeconds=== 20,否则我无法从SQS获得任何消息。我的messages看起来像这样:

messages: {
ResponseMetadata: { RequestId: 'a1b6eb4e-7986-5c77-abff-b3e857329498' }
}

如果我设置WaitTimeSeconds: 20,那么我可以收到我的消息。任何其他值都不会返回任何消息。我让它每分钟在cron上运行一次,我已经让它运行了几个小时,没有成功检索到任何东西(除非等待时间是20秒)。有什么建议吗?

您已选择使用FIFO队列。

From Using Amazon SQS消息组ID - Amazon Simple Queue Service:

消息组ID是指定消息属于特定消息组的标记。属于同一消息组的消息总是按照相对于消息组的严格顺序依次处理(但是,属于不同消息组的消息可能会按顺序处理)。

这意味着如果一条消息是当前的"在飞行"(这意味着它已从队列接收,但尚未删除),那么SQS FIFO队列将不会提供具有相同MessageGroupId的另一条消息。. 这是为了确保按顺序处理消息。例如,正在运行的消息可能超过了它的隐形超时并返回到队列,因此具有相同MessageGroupId的其他消息在第一个消息被删除之前不能被处理。

如果不需要这种级别的隔离,则为每条消息指定不同的MessageGroupId. 这将使消息保持有序,并使所有消息可用。

这听起来也像你在玩弄队列,可能检索消息而不删除它们。如果是这样,消息将在20秒内"不可见"(VisibilityTimeout: 20)。在此期间检索消息的任何尝试都将而不是返回这些消息。可能就是你有时收不到消息的原因。

最新更新