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 秒,则总超时值将为过去的时间 (15 秒) 加上新的超时值 (10 秒),即 25 秒。在 25 秒后发送调用将导致错误。

注意

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

终止消息的可见性超时

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

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

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

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

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

设置队列的可见性超时

SetQueueAttributes

获取队列的可见性超时

GetQueueAttributes

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

ReceiveMessage

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

ChangeMessageVisibility

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

ChangeMessageVisibilityBatch