单例 AmazonSQSClient 接收消息并发和 ReceiptHandle 问题

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

AmazonSQSClient 被宣传为线程安全,但如果我要使用它来并发接收消息,那么在成功处理消息后如何删除消息?

我从docs了解到,用于删除消息的ReceiptHandle会在每次请求后发生变化,并且我必须使用最后一个ReceiptHandle来删除消息。

我的结论是,AmazonSQSClient 不应该用作单例,实例应该只按顺序处理消息:接收、处理、删除。

我错过了什么吗?

c# .net amazon-sqs
1个回答
0
投票

好吧,这个想法是收据句柄实际上与消息相关联,因此您始终可以在删除所需消息之前检索多条消息。

但是,如果您再次收到相同消息,收据句柄将会不同,您应该使用最后一个。

这里的想法是,您不应该真正保留 ReceiptHandle 或将其视为指向消息(例如在数据库中)的绝对 id,因为:

  1. 您可能无法处理消息,因此在达到可见性超时后,其他消费者(或您的实例)将可以看到该消息。

  2. 只有当前正在处理消息的消费者才能删除它。

ReceiptHandle 与接收消息的特定实例相关联。如果您多次收到消息,则每次收到消息时的 ReceiptHandle 都会不同。当您使用DeleteMessage操作时,您必须提供最近收到的消息的ReceiptHandle(否则,请求成功,但消息不会被删除)。

https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_DeleteMessage.html

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