成千上万的用户如何接收发布到 AWS SNS 主题的相同消息

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

我向我的 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-web-services amazon-sqs amazon-sns
1个回答
0
投票

当您使用 Amazon SQS 控制台“轮询”消息时,实际上是通过

ReceiveMessage
API 调用来访问它们。这将触发这些消息的可见性超时,因此在超时到期之前它们无法用于接收。将可见性超时设置为零会导致更多消息可用,这一事实表明了这一点。

如果您希望代码在“正常”条件下运行,我建议您在代码运行时不要使用控制台查看消息队列。

另外,来自

ReceiveMessage - Amazon Simple Queue Service

短轮询是默认行为,其中在 ReceiveMessage 调用上对一组加权随机机器进行采样。因此,仅返回采样机器上的消息。如果队列中的消息数量较少(少于 1,000 条),则每次 ReceiveMessage 调用您很可能“收到的消息少于您请求的消息”。如果队列中的消息数量极少,您可能不会在特定的 ReceiveMessage 响应中收到任何消息。如果发生这种情况,请重复请求。

因此,您不一定总是获得请求的完整消息数,具体取决于消息在 Amazon SQS 服务器上的分发方式。另请参阅:

基本 Amazon SQS 架构 - Amazon Simple Queue Service

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