Amazon Simple Queue Service
开发人员指南
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。点 击 Getting Started with Amazon AWS to see specific differences applicable to the China (Beijing) Region.

可见性超时

当使用者接收并处理来自某个队列的消息时,消息将保留在该队列中。Amazon SQS 不会自动删除消息:因为它是一个分布式系统,不能保证组件会实际上接收消息 (连接可能中断或者组件可能因故障而无法接收消息)。因此,使用者在接收和处理消息后必须从队列中删除该消息。

在收到消息后,消息将立即保留在队列中。为防止其他使用者再次处理消息,Amazon SQS 设置了可见性超时,这是 Amazon SQS 防止其他使用组件接收和处理消息的时间段。

注意

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

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

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

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

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

传输中的消息

如果消息已由使用者通过队列接收但尚未从队列中删除,则消息将被视为正在传送

对于每个标准队列,其传输中的消息的最大数目为 120000。如果您达到此限制,Amazon SQS 将返回 OverLimit 错误消息。为避免达到此限制,您应该在处理消息后将其从队列中删除。您还可以增加用来处理消息的队列的数量。

对于每个 FIFO 队列,其传输中的消息的最大数目为 20000。如果您达到此限制,Amazon SQS 不会返回任何错误消息。

下图阐明了可见性超时。

 可见性超时

配置可见性超时

在 Amazon SQS 返回该消息后,可见性超时时钟开始计时。在这段时间里,该组件会处理并删除该消息。但是,如果该组件在删除该消息前发生故障,则会出现什么情况?如果您的系统在可见性超时过期之前没有为该消息调用 DeleteMessage,则该消息会再次变为对您系统中的组件发出的 ReceiveMessage 调用可见,并且会再次被接收。如果某条消息只应被接收一次,则您的系统应在可见性超时期间删除该消息。

每个队列的起始可见性超时的默认设置为 30 秒。您可以为整个队列更改该设置。通常,您会将可见性超时设置为处理消息并从队列中删除消息的平均时间。此外,在接收消息时,您还可以为返回的消息设置特殊的可见性超时,而无需更改整个队列的超时。

如果您不知道处理消息所需的时间,请指定初始可见性超时(例如 2 分钟)和时段(在此时段后,您可以检查是否已处理消息)(例如 1 分钟)。如果消息未得到处理,请延长可见性超时 (例如,延长至 3 分钟)。

更改消息的可见性超时

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

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

注意

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

终止消息的可见性超时

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

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

与可见性超时相关的 API 操作

下表列出了用于操纵可见性超时的 API 操作。请使用每个操作的 VisibilityTimeout 参数来设置或获取值。

要执行以下任务…… 请使用以下操作

设置队列的可见性超时

SetQueueAttributes

获取队列的可见性超时

GetQueueAttributes

设置所收到消息的可见性超时,而不影响队列的可见性超时

ReceiveMessage

延长或终止消息的可见性超时

ChangeMessageVisibility

延长或终止多达 10 条消息的可见性超时。

ChangeMessageVisibilityBatch