很久以前,亚马逊推出了长轮询功能。通过这种方式,可以在队列上配置“接收消息等待时间”参数。根据文档,有效值落在0 - 20秒范围内。
在客户端中,我们还可以在每个 MessageReceiveRequest 上配置此参数。我正在使用AWS SDK for .NET。
var receiveRequest = new ReceiveMessageRequest
{
QueueUrl = "https://queue-url-goes-here.com",
MaxNumberOfMessages = 10,
VisibilityTimeout = 30,
WaitTimeSeconds = 20 // This should tell if we want long polling or not
};
问题:
a)在队列VS中配置的接收消息等待时间与消息接收请求中设置的 WaitTimeSeconds 属性之间的关系是什么?他们会独立工作吗?或者,客户端中设置的值将覆盖队列中设置的值(对于该单个请求)。
b)在某些情况下,C#客户端可以超时吗?我正在考虑将这两个值设置为最大值(20秒),但我担心这可能导致C#长轮询操作超时。
c)最佳做法是什么? WaitTimeSeconds > 接收消息等待时间?
答案 0 :(得分:3)
a)正如pastk的回答所述,消息上的WaitTimeSeconds将覆盖队列中配置的接收消息等待时间。有关详细信息,请参阅long polling文档。
b)AWS SDK for .NET使用System.Net.HttpWebRequest - its default timeout is 100 seconds。如果您使用的是默认值,则将WaitTimeSeconds设置为20秒不会导致操作超时。
c)亚马逊在这一点上没有规定最佳做法。做你认为最适合你的场景的任何事情。
答案 1 :(得分:2)
它只是设置所需等待时间的另一种方式。 请求级别等待时间始终覆盖队列值:“对于ReceiveMessage的WaitTimeSeconds参数,设置在1到20之间的值优先于为队列属性ReceiveMessageWaitTimeSeconds设置的任何值。” (http://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-long-polling.html)
如果某些队列的消费者需要使用长轮询,而其他消费者则不需要使用每个请求的等待时间设置,否则使用队列的设置会更简单。