从SQS只接收到一条消息(nodejs-aws-sdk)



我用默认设置创建了一个SQS。我向它发布了两条消息,我想同时把它们读回来。我这样试过:


const sqsClient = new SQSClient({ region: REGION });
const params = {
AttributeNames: ["SentTimestamp"],
MaxNumberOfMessages: 5,
MessageAttributeNames: ["All"],
QueueUrl: queueURL,
WaitTimeSeconds: 5,
};
const data = await sqsClient.send(new ReceiveMessageCommand(params));
const messages = data.Messages ?? [];
console.log(messages.length);

不幸的是,无论我在MaxNumberOfMessages中提供什么,都只返回一条消息。是什么原因造成的?如何解决这个问题?

我找到了一个类似的问题,但只有一个答案,那就是第三方图书馆。

ReceiveMessageCommand不能保证您将获得为MaxNumberOfMessages指定的确切消息数。事实上,文件上写着:

Short poll是默认行为,其中在ReceiveMessage调用中对机器的加权随机集进行采样。因此,只返回采样机器上的消息。如果队列中的消息数量较少(少于1000条(,则每次ReceiveMessage调用收到的消息很可能少于请求的消息。如果队列中的消息数量非常少,则可能不会在特定的ReceiveMessage响应中接收到任何消息。如果发生这种情况,请重复请求。

必须使用长轮询才能接收多条消息。这实质上是将WaitTimeSeconds设置为一个更大的值(5秒应该足够了(。队列中必须有更多的消息,才能通过一次调用获取多条消息。

总结:

  1. SQS是一个分布式系统,每次调用只轮询一台机器
  2. 消息分布在这些机器上,如果您有少量消息,则可能只获取一条消息,或者不获取任何消息
  3. 使用一组更大的已发送消息测试您的代码,并将您的接收呼叫置于循环中

最新更新