当使用者接收并处理来自某个队列的消息时,消息将保留在该队列中。Amazon SQS 不会自动删除消息。因为 Amazon SQS 是分布式系统,所以无法保证使用者实际收到消息(例如,由于连接问题或由于使用者应用程序问题)。因此,使用者在接收和处理消息后必须从队列中删除该消息。
在收到消息后,消息将立即保留在队列中。为防止其他使用者再次处理消息,Amazon SQS 设置了可见性超时,这是 Amazon SQS 防止其他使用者接收和处理消息的时间段。消息的默认可见性超时为 30 秒。最小值为 0 秒。最大值为 12 小时。 有关使用 AWS 管理控制台配置队列的可见性超时以及使用 AWS SDK for Java(以及 SetQueueAttributes
、GetQueueAttributes
、ReceiveMessage
、ChangeMessageVisibility
和 ChangeMessageVisibilityBatch
操作)配置一条或多条消息的可见性超时的信息,请参阅配置 Amazon SQS 队列的可见性超时。
注意
对于标准队列,可见性超时无法保证不会接收消息两次。有关更多信息,请参阅至少一次传递。
FIFO 队列允许创建者或使用者进行多次重试:
-
如果创建者检测到失败的
SendMessage
操作,它会使用同一个消息重复数据删除 ID 尽可能多地重新尝试发送。假设创建者在重复数据删除间隔过期前收到至少一次确认,则多次重试不会影响消息排序,也不会引入重复项。 -
如果使用者检测到失败的
ReceiveMessage
操作,它可使用同一个接收请求尝试 ID 进行所需数量的重试。假设使用者在可见性超时过期前收到至少一次确认,则多次重试不会影响消息排序。 -
在收到一个具有消息组 ID 的消息时,除非您删除该消息或该消息变为可见,否则不会返回同一消息组 ID 的更多消息。
终止消息的可见性超时
收到来自某个队列的某条消息时,您可能会发现,您实际上不想处理并删除该消息。Amazon SQS 允许您终止特定消息的可见性超时。这将使该消息对系统中的其他组件立即可见并且可用于处理。
要在调用 ReceiveMessage
后终止消息的可见性超时,请调用 ChangeMessageVisibility
并将 VisibilityTimeout
设置为 0 秒。