本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
Amazon SQS 可见性超时
当使用者接收并处理来自某个队列的消息时,消息将保留在该队列中。Amazon SQS 不会自动删除消息。因为 Amazon SQS 是分布式系统,所以无法保证使用者实际收到消息 (例如,由于使用者应用程序问题)。因此,使用者在接收和处理消息后必须从队列中删除该消息。

在收到消息后,消息将立即保留在队列中。为防止其他用户再次处理消息,Amazon SQS 会将可见性超时,即 Amazon SQS 阻止其他用户接收并处理消息的一段时间。消息的默认可见性超时为 30 秒。最小为 0 秒。最长为 12 小时。有关使用控制台为队列配置可见性超时的信息,请参阅配置队列参数(控制台).
注意
对于标准队列,可见性超时无法保证不会接收消息两次。有关更多信息,请参阅 At-least-once 交付。
FIFO 队列允许生产者或使用者尝试多次重试:
-
如果生产者检测到失败
SendMessage
操作时,它可以使用相同的消息重复数据删除 ID 根据需要多次重试发送。假设创建器在重复数据删除间隔到期之前至少收到一次确认,则多次重试既不会影响消息的顺序,也不会引入重复消息。 -
如果消费者检测到失败
ReceiveMessage
操作,则可以使用相同的接收请求尝试 ID 根据需要重试多次。假设消费者在可见性超时到期之前至少收到一个确认,那么多次重试不会影响消息的顺序。 -
当您收到带有消息组 ID 的消息时,不会再返回同一消息组 ID 的消息,除非您删除该消息或该消息变为可见。
在航班上留言
Amazon SQS 消息有三种基本状态:
-
由生产者发送到队列。
-
由消费者从队列中接收。
-
已从队列删除。
一条消息被视为已存储在它由生产者发送到队列之后,但消费者尚未从队列中接收(即在状态 1 和 2 之间)。存储的消息数量没有配额。一条消息被视为Flight在消费者从队列中接收但尚未从队列中删除之后(即在状态 2 和 3 之间)。对于传输中的消息数量,存在配额。
重要
适用于飞行消息的配额与无限的存储的消息数。
对于大多数标准队列(取决于队列流量和消息积压),最多可能有 120000 个传输中的消息(由使用者从队列接收但尚未从队列删除)。如果您在使用时达到此配额短轮询,Amazon SQS 会返回OverLimit
错误消息。如果您使用长轮询,Amazon SQS 不会返回任何错误消息。为避免达到此配额,您应该在处理消息后将其从队列中删除。您还可以增加用来处理消息的队列的数量。要申请提高配额,请提交支持请求
对于 FIFO 队列,飞行消息最多可以有 20,000 条(由消费者从队列中接收,但尚未从队列中删除)。如果您达到此配额,Amazon SQS 不会返回任何错误消息。
重要
在使用 FIFO 队列时,DeleteMessage
如果在可见性超时窗口之外收到请求,则操作将失败。如果可见性超时为 0 秒,则消息必须在发送的毫秒内删除,否则将被视为已放弃。这可能会导致 Amazon SQS 在同一响应中包含重复的消息ReceiveMessage
operation时MaxNumberOfMessages
参数大于 1。有关其他详细信息,请参阅Amazon SQS FIFO API 的工作原理
设置可见性超时
可见性超时从 Amazon SQS 返回消息时开始。在这段时间里,使用者可以处理和删除消息。但是,如果使用者在删除消息之前失败,并且您的系统没有在可见性超时结束之前对该消息调用 DeleteMessage
操作,则其他使用者将可以看到该消息并且再次接收该消息。如果某条消息只能被接收一次,则您的使用者应在可见性超时期间内删除该消息。
每个 Amazon SQS 队列都具有 30 秒的默认可见性超时设置。您可以为整个队列更改此设置。通常,您应将可见性超时设置为您的应用程序处理消息并从队列中删除消息所需的最长时间。此外,在接收消息时,您还可以为返回的消息设置特殊的可见性超时,而无需更改整个队列的超时。有关更多信息,请参阅及时处理消息部分中的最佳实践。
如果您不知道处理消息需要多长时间,请创建一个心跳对于您的消费者流程:指定初始可见性超时(例如 2 分钟),然后(只要您的使用者仍在处理消息),则继续将可见性超时每分钟延长 2 分钟。
重要
最大可见性超时为从 Amazon SQS 收到可见性超时时时起 12 小时ReceiveMessage
请求. 延长可见性超时不会重置 12 小时的最大值。
此外,您可能无法将单条消息的超时设置为整整 12 小时(例如 43,200 秒),因为ReceiveMessage
请求启动计时器。例如,如果您收到一条消息,并立即通过发送ChangeMessageVisibility
使用调用VisibilityTimeout
等于 43,200 秒,则很可能会失败。但是,使用 43,195 秒的值将起作用,除非在通过以下方式请求消息之间存在显著延迟ReceiveMessage
并更新可见性超时。如果您的使用者需要超过 12 小时,请考虑使用Step Functions。
更改消息的可见性超时
当您收到来自队列的消息并开始处理该消息时,队列的可见性超时可能不够 (例如,您可能需要处理和删除消息)。可通过使用 ChangeMessageVisibility
操作指定新的超时值来缩短或延长消息的可见性。
例如,如果队列的默认超时值为 60 秒,在您接收消息后 15 秒时,您发送了 ChangeMessageVisibility
调用并将 VisibilityTimeout
设为 10 秒,则这 10 秒从您进行 ChangeMessageVisibility
调用时开始计时。因此,自您最初更改可见性超时后 10 秒 (共 25 秒) 起,任何更改可见性超时或删除此消息的尝试都可能导致错误。
注意
新的超时期限自您调用 ChangeMessageVisibility
操作起生效。此外,新的超时期限仅应用于消息的特定接收。ChangeMessageVisibility
不会影响消息的后续接收或后续队列的超时。
终止消息的可见性超时
收到来自某个队列的某条消息时,您可能会发现,您实际上不想处理并删除该消息。Amazon SQS 允许您终止特定消息的可见性超时。这将使该消息对系统中的其他组件立即可见并且可用于处理。
要在调用 ReceiveMessage
后终止消息的可见性超时,请调用 ChangeMessageVisibility
并将 VisibilityTimeout
设置为 0 秒。