使用 AWS SQS,为什么对 ReceiveMessageAsync 的后续调用没有 return 任何消息?

With AWS SQS, why do subsequent calls to ReceiveMessageAsync not return any messages?

首先,我知道在使用SQS处理消息时,我应该在处理完消息后删除消息。但是,我假设如果我有多个线程,每个线程都应该能够接收消息、处理它们,然后稍后删除它们。

那么,为什么如果我收到消息,但没有删除它们,在可见性超时期限到期之前我无法再检索?

或者,换句话说,如何同时处理 10 条以上的消息?

我有数百条消息,预计这段代码会 return 30 条消息:

private static async Task TryToDisplayAllMessagesButForSomeReasonOnlyTheFirstRequestWorksAsync()
{
    var client = new AmazonSQSClient(RegionEndpoint.EUWest1);
    var request = new ReceiveMessageRequest
    {
        QueueUrl = QUEUE_URL,
        MaxNumberOfMessages = 10,
        VisibilityTimeout = 10
    };
    var messages1 = await client.ReceiveMessageAsync(request);
    Console.WriteLine($"{messages1.Messages.Count} messages received");
    var messages2 = await client.ReceiveMessageAsync(request);
    Console.WriteLine($"{messages2.Messages.Count} messages received");
    Thread.Sleep(11000);
    var messages3 = await client.ReceiveMessageAsync(request);
    Console.WriteLine($"{messages3.Messages.Count} messages received");
}

相反,它 return 是 20,因为在 VisibilityTimeout 期限到期之前我无法收到更多。

输出:

10 messages received
0 messages received
10 messages received

提前致谢:)

如果您的 FIFO 队列中的多条消息具有相同的消息组 ID,那么为了确保消息的 FIFO 顺序,一旦您检索到其中一些具有该组 ID 的消息,其余消息将不可见直到您删除从队列中检索到的那些。