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

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

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 之间)之后。已存储邮件的数量没有配额。消息被视为在 Flight,但尚未从队列中删除(即状态 2 和 3 之间)。存在传输中的消息数量配额。

重要

应用于正在进行的邮件的配额与unlimited已存储消息的数量。

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

对于 FIFO 队列,最多可能有 20000 个传输中的消息(使用者从队列接收,但尚未从队列中删除)。如果您达到此配额,Amazon SQS 不返回任何错误消息。

设置可见性超时

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

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

如果您不知道处理消息需要多长时间,请在检测信号适用于您的消费者流程:指定初始可见性超时(例如 2 分钟),然后(只要您的使用者仍在处理消息),将可见性超时延长每分钟 2 分钟。

重要

最大可见性超时为从 Amazon SQS 收到ReceiveMessage请求. 延长可见性超时不会重置 12 小时的最大值。如果您的使用者需要超过 12 小时,请考虑使用步进功能。

更改消息的可见性超时

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

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

注意

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

终止消息的可见性超时

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

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