使用 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 的消息,其余消息将不可见直到您删除从队列中检索到的那些。
首先,我知道在使用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 的消息,其余消息将不可见直到您删除从队列中检索到的那些。