Amazon SQS 可见性超时 - Amazon Simple Queue Service
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

Amazon SQS 可见性超时

当使用者接收并处理来自某个队列的消息时,消息将保留在该队列中。Amazon SQS 不会自动删除消息。因为 Amazon SQS 是分布式系统,所以无法保证使用者实际收到消息(例如,由于连接问题或由于使用者应用程序问题)。因此,使用者在接收和处理消息后必须从队列中删除该消息。


	            可见性超时

在收到消息后,消息将立即保留在队列中。为防止其他使用者再次处理消息,Amazon SQS 设置了可见性超时,这是 Amazon SQS 防止其他使用者接收和处理消息的时间段。消息的默认可见性超时为 30 秒。最小值为 0 秒。最大值为 12 小时。 有关使用控制台为队列配置可见性超时的信息,请参阅 配置队列参数(控制台).

注意

对于标准队列,可见性超时不能保证不会两次收到消息。有关更多信息,请参阅 至少一次传递。)

FIFO 队列允许创建者或使用者进行多次重试:

  • 如果创建者检测到失败的 SendMessage 操作,它会使用同一个消息重复数据删除 ID 尽可能多地重新尝试发送。假设创建者在重复数据删除间隔过期前收到至少一次确认,则多次重试不会影响消息排序,也不会引入重复项。

  • 如果使用者检测到失败的 ReceiveMessage 操作,它可使用同一个接收请求尝试 ID 进行所需数量的重试。假设使用者在可见性超时过期前收到至少一次确认,则多次重试不会影响消息排序。

  • 在收到一个具有消息组 ID 的消息时,除非您删除该消息或该消息变为可见,否则不会返回同一消息组 ID 的更多消息。

传输中的消息

Amazon SQS 消息有三种基本状态:

  1. 创建者将消息发送到队列。

  2. 使用者从队列接收消息。

  3. 从队列中删除消息。

消息在已由创建者发送到队列,但使用者尚未从队列接收后将被视为已存储(即,介于状态 1 和 2 之间)。对存储消息的数量没有任何配额限制。消息在使用者已从队列接收,但尚未从队列中删除后将被视为在传输中(即,介于状态 2 和 3 之间)。对在传输中的消息的数量是有配额限制的。

重要

Quotas that apply to inflight messages are unrelated to the unlimited number of stored messages.

对于大多数标准队列(取决于队列流量和消息积压),最多可以有 120000 条左右传输中的消息(使用者已从队列接收,但尚未从队列中删除)。如果您在使用短轮询时达到此配额,则 Amazon SQS 返回 OverLimit 错误消息。如果您使用长轮询,则 Amazon SQS 不返回任何错误消息。为避免达到此配额,您应该在处理消息后将其从队列中删除。您还可以增加用来处理消息的队列的数量。要申请提高配额,请提交支持请求

对于 FIFO 队列,其传输中的消息的最大数目为 20000 条(使用者已从队列接收,但尚未从队列中删除)。如果您达到此限制,Amazon SQS 不会返回任何错误消息。

设置可见性超时

可见性超时从 Amazon SQS 返回消息时开始。在这段时间里,使用者可以处理和删除消息。但是,如果使用者在删除消息之前失败,并且您的系统没有在可见性超时结束之前对该消息调用 DeleteMessage 操作,则其他使用者将可以看到该消息并且再次接收该消息。如果某条消息只能被接收一次,则您的使用者应在可见性超时期间内删除该消息。

每个 Amazon SQS 队列都具有 30 秒的默认可见性超时设置。您可以为整个队列更改此设置。通常,您应将可见性超时设置为您的应用程序处理消息并从队列中删除消息所需的最长时间。此外,在接收消息时,您还可以为返回的消息设置特殊的可见性超时,而无需更改整个队列的超时。有关更多信息,请参阅及时处理消息部分中的最佳实践。

如果您不知道处理消息所需的时间,请为使用者处理创建检测信号:指定初始可见性超时(例如,2 分钟),然后每一分钟将可见性超时延长 2 分钟,前提是您的使用者仍在处理消息。

重要

最大可见性超时为从 Amazon SQS 收到消息时起 12 小时。延长可见性超时不会重置 12 小时的最大值。如果您的使用者需要超过 12 小时,请考虑使用 Step Functions。

更改消息的可见性超时

当您收到来自队列的消息并开始处理该消息时,队列的可见性超时可能不够 (例如,您可能需要处理和删除消息)。可通过使用 ChangeMessageVisibility 操作指定新的超时值来缩短或延长消息的可见性。

例如,如果队列的默认超时值为 60 秒,在您接收消息后 15 秒时,您发送了 ChangeMessageVisibility 调用并将 VisibilityTimeout 设为 10 秒,则这 10 秒从您进行 ChangeMessageVisibility 调用时开始计时。因此,自您最初更改可见性超时后 10 秒 (共 25 秒) 起,任何更改可见性超时或删除此消息的尝试都可能导致错误。

注意

新的超时期限自您调用 ChangeMessageVisibility 操作起生效。此外,新的超时期限仅适用于消息的特定接收。ChangeMessageVisibility 不会影响消息的后续接收或后续队列的超时。

终止消息的可见性超时

收到来自某个队列的某条消息时,您可能会发现,您实际上不想处理并删除该消息。Amazon SQS 允许您终止特定消息的可见性超时。这将使该消息对系统中的其他组件立即可见并且可用于处理。

要在调用 ReceiveMessage 后终止消息的可见性超时,请调用 ChangeMessageVisibility 并将 VisibilityTimeout 设置为 0 秒。