Amazon SQS 接收消息进程是否会使其不可用?

问题描述 投票:0回答:1

我是 SQS 的新手,但我曾使用过 Azure 服务总线,如果我没记错的话,一旦你从队列中“弹出”一条消息,它基本上就不再存在于队列中,因此你不必担心多个消费者得到同样的信息(如果这是不正确的,请原谅)。

我正在遵循 Amazon .NET SDK 示例从队列中“接收和删除”消息,这对我来说意味着在删除消息之前,其他消费者可能会收到它。它是否正确?有没有办法在收到它的同时将其从队列中删除,或者以其他方式保护它免遭重复消费?

// Receive a single message from the queue.
var receiveMessageRequest = new ReceiveMessageRequest
{
    AttributeNames = { "GlobalTransactionId", "Amount", "TransactionDate" },
    MaxNumberOfMessages = 1,
    MessageAttributeNames = { "All" },
    QueueUrl = queueUrl,
    VisibilityTimeout = 0,
    WaitTimeSeconds = 0,
};

var receiveMessageResponse = await client.ReceiveMessageAsync(receiveMessageRequest);

// Delete the received message from the queue.
var deleteMessageRequest = new DeleteMessageRequest
{
    QueueUrl = queueUrl,
    ReceiptHandle = receiveMessageResponse.Messages[0].ReceiptHandle,
};

var deleteMessageResponse = await client.DeleteMessageAsync(deleteMessageRequest);
amazon-web-services amazon-sqs message-bus
1个回答
0
投票

根据 Amazon SQS 消息生命周期

  • 消费者调用
    ReceiveMessage()
    从队列中请求一条消息(或一批消息)
  • 这些消息将在规定的时间内被标记为“不可见”
  • 消费者处理完消息后,它会调用
    DeleteMessage()
    从队列中删除消息
  • 如果消费者在可见性超时到期之前没有删除消息,那么消息将在假设消费者失败的情况下“重新出现”在队列中

您的消费者可以致电

ReceiveMessage()
,然后针对收到的每条消息立即致电
DeleteMessage()
。但是,这存在消息未正确使用的风险。这是你的选择。

不可能“在收到它的同时将其从队列中删除”。

为了“防止重复消费”,请确保可见性超时比处理消息所需的时间大几倍。即接收消息和删除消息之间的时间。

© www.soinside.com 2019 - 2024. All rights reserved.