SQS短轮询比长轮询更好吗?

43

Amazon SQS支持两种可用消息的轮询模式:短轮询和长轮询。使用长轮询,消费者指定等待可用消息的超时时间1-20秒。

根据文档:

默认情况下,Amazon SQS使用短轮询,仅查询其服务器的子集(基于加权随机分布)以确定是否有任何可用消息作出响应。

长轮询提供以下优点:

  • 允许Amazon SQS等待队列中有消息可用后再发送响应,从而消除空响应。除非连接超时,否则对于ReceiveMessage请求的响应至少包含一个可用消息,最多包含ReceiveMessage操作中指定的最大数量的消息。
  • 通过查询所有Amazon SQS服务器而不是部分服务器,消除虚假的空响应。
  • 一旦消息变为可用状态,立即返回该消息。

上述特性使得长轮询看起来非常好。那么是否存在短轮询更可取的用例呢?

特别是对于高吞吐量队列,短轮询是否比长轮询更快?

1个回答

52
长轮询(Long polling)几乎总是优于短轮询。以下是两种情况,短轮询可能会更受欢迎(在SQS常见问题解答中给出):
- 当需要立即处理消息时。 - 当您在单个线程中轮询多个队列时。
根据SQS常见问题解答
几乎在所有情况下,Amazon SQS长轮询优于短轮询。长轮询请求可让您的队列消费者在消息到达队列后立即接收消息,同时减少返回空ReceiveMessageResponse实例的数量。
在大多数使用情况下,Amazon SQS长轮询可以提高性能并降低成本。但是,如果您的应用程序希望从ReceiveMessage调用中获得立即响应,则可能需要对应用程序进行一些修改才能利用长轮询。
例如,如果您的应用程序使用单个线程来轮询多个队列,则从短轮询切换到长轮询可能不起作用,因为单个线程将等待任何空队列的长轮询超时,从而延迟处理可能包含消息的任何队列。
在这样的应用程序中,使用单个线程仅处理一个队列是一个好习惯,这样应用程序就可以利用Amazon SQS长轮询提供的好处。

23
“当需要立即处理消息时”这个翻译不太准确。应该翻译成“当调用ReceiveMessage必须立即返回时”。长轮询实际上比短轮询更能够及时处理消息。请注意AWS文档中引用的问题,“尽快返回可用的消息”。 - Mark
短期和长期之间的成本差异究竟是多少? - Jatin Morar
@JatinMorar 主要是空接收的成本,具体数字将取决于实际使用情况。 - Jerry Chin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接