我向我的 AWS SNS 主题发布了一些消息。然后,我向 .NET 控制台应用程序添加了一些代码来接收消息。问题是我永远无法同时收到 3 条消息。这是我在 .NET 控制台应用程序中的代码:
var credentials = new BasicAWSCredentials("someKey", "someKey");
sqsClient = new AmazonSQSClient(credentials, RegionEndpoint.USEast1);
var receiveMessageRequest = new ReceiveMessageRequest
{
QueueUrl = queueUrl,
MaxNumberOfMessages = 10,
WaitTimeSeconds = 20 // Long polling for 20 seconds
};
var response = await sqsClient.ReceiveMessageAsync(receiveMessageRequest);
我的队列设置是:类型标准,可见性超时30秒。当我在 AWS 控制台中轮询消息时,我可以看到所有三条消息。但在
response
中,我只能看到一部分。第一次运行该应用程序时,我收到第一条消息。第二次我收到另外两条消息。
然后我将设置更新为可见性超时 0 秒,我一次收到 10 条消息(它们是重复的),这很奇怪。
我如何接收这三个消息?如果我有许多用户使用同一个应用程序并且能够同时查看消息,是否有可能(因为我在某处读到从同一队列轮询消息之间会有一些间隙) ?
当您使用 Amazon SQS 控制台“轮询”消息时,实际上是通过
ReceiveMessage
API 调用来访问它们。这将触发这些消息的可见性超时,因此在超时到期之前它们无法用于接收。将可见性超时设置为零会导致更多消息可用,这一事实表明了这一点。
如果您希望代码在“正常”条件下运行,我建议您在代码运行时不要使用控制台查看消息队列。
另外,来自ReceiveMessage - Amazon Simple Queue Service:
短轮询是默认行为,其中在 ReceiveMessage 调用上对一组加权随机机器进行采样。因此,仅返回采样机器上的消息。如果队列中的消息数量较少(少于 1,000 条),则每次 ReceiveMessage 调用您很可能“收到的消息少于您请求的消息”。如果队列中的消息数量极少,您可能不会在特定的 ReceiveMessage 响应中收到任何消息。如果发生这种情况,请重复请求。因此,您不一定总是获得请求的完整消息数,具体取决于消息在 Amazon SQS 服务器上的分发方式。另请参阅:
基本 Amazon SQS 架构 - Amazon Simple Queue Service