我是 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);
ReceiveMessage()
从队列中请求一条消息(或一批消息)DeleteMessage()
从队列中删除消息您的消费者可以致电
ReceiveMessage()
,然后针对收到的每条消息立即致电 DeleteMessage()
。但是,这存在消息未正确使用的风险。这是你的选择。
不可能“在收到它的同时将其从队列中删除”。
为了“防止重复消费”,请确保可见性超时比处理消息所需的时间大几倍。即接收消息和删除消息之间的时间。