AWS SQS ReceiveMessageAsync如果调用waittimesecseconds = 0,则不会获得消



我有EventBridge将消息推送到SQS,并且SQS消息也被后台进程消费。

在后台进程中,我使用以下代码片段(以1s延迟执行):

var receiveMessageRequest = new ReceiveMessageRequest()
{
    QueueUrl = await GetQueueUrl(),
    WaitTimeSeconds = 0, // this is problematic line
    MaxNumberOfMessages = 1
};
var response = await _sqsClient.ReceiveMessageAsync(receiveMessageRequest);

这个场景是我发送1个消息到EventBridge,然后路由到SQS。

如果我用WaitTimeSeconds = 0轮询队列,有时会在20-40秒后收到消息(奇怪的是,这对应于SQS的Default visibility timeout = 30,但不确定)。

然而,如果我用WaitTimeSeconds = 1调用此函数,则它按预期工作,这意味着消息被快速接收。

我的疯狂假设是:看起来,如果队列中有1条消息,并且使用了短轮询,则由于某些原因它是不可见的。

按文档

您看到的这种行为是因为短轮询和长轮询。引用文档

对于短轮询,ReceiveMessage请求仅查询服务器的一个子集(基于加权随机分布),以查找可包含在响应中的消息。Amazon SQS立即发送响应,即使查询没有发现消息。

对于长轮询,ReceiveMessage请求查询所有服务器的消息。Amazon SQS在收集到至少一条可用消息(不超过请求中指定的最大消息数)后发送响应。Amazon SQS仅在轮询等待时间到期时发送空响应。

,并在文档底部解释短轮询的行为通过设置** waittimesecseconds ** var

当ReceiveMessage请求的waittimesecseconds参数以以下两种方式之一设置为0时,将发生短轮询:

  • ReceiveMessage调用设置waittimesecseconds为0。
  • ReceiveMessage调用没有设置waittimesecseconds,但是队列属性receivemessagewaittimesecseconds被设置为0。

相关内容

  • 没有找到相关文章

最新更新