英文版本为准
本页译自英文,由模型翻译。若与英文原文存在差异,以英文原文为准。
可见性
收到的 SQS 消息留在队列中,在可见性超时内不可见,直到删除结束它,或者它回来等待下一次接收。
以文字阅读本图
- 已存储 下一次接收可见 → 传输中 在可见性超时内不可见, 带接收句柄,接收计数 + 1: ReceiveMessage
- 传输中 在可见性超时内不可见, 带接收句柄,接收计数 + 1 → DeleteMessage: 消失
- 传输中 在可见性超时内不可见, 带接收句柄,接收计数 + 1 → 超时 到期
- 传输中 在可见性超时内不可见, 带接收句柄,接收计数 + 1 → ChangeMessage Visibility(0)
- 超时 到期 → 再次可见 下一次接收再计数一次
- ChangeMessage Visibility(0) → 再次可见 下一次接收再计数一次
- 再次可见 下一次接收再计数一次 → 已接收 maxReceiveCount 次: 移入死信队列: 在下一次接收时
- ChangeMessageVisibility(n) 再隐藏 n 秒, 最晚到接收后 12 小时
接收把消息连同一个接收句柄交出,并在可见性超时内对其他所有接收隐藏它。除非接收指定了超时,否则使用队列自己的超时:默认 30 秒,最长 12 小时。SQS 按整秒计算超时,最短一秒。消费者用这次接收的接收句柄删除消息。
没有及时删除的消息会再次可见,并被再投递一次。ChangeMessageVisibility 设置一个新的超时,从调用时开始计算。超时为零时,消息立即可见。如果新超时的结束时间晚于接收后 12 小时,调用会被拒绝。
每次接收都让消息的 ApproximateReceiveCount 加一。带重新驱动策略的队列指定一个死信队列和一个 1 到 1000 之间的 maxReceiveCount。消息被接收这么多次仍未删除时,下一次接收不再投递它,而是把它移入死信队列。死信队列与源队列类型相同:FIFO 队列对应 FIFO 死信队列。
SQS 没有可续期的租约。处理器持有投递期间,本 crate 在每个超时过半时调用 ChangeMessageVisibility。因此,处理较慢的处理器不会遇到同一条消息的第二次投递与它竞争。另一半超时留给调用到达队列。投递结算或被丢弃时,延长随之停止。超时为零的队列不做延长。
接收后的 12 小时同样限制延长。处理器持有投递这么久时,本 crate 把可见性最后一次延长到这 12 小时结束,并记录一条警告日志。之后队列把消息交给另一个消费者。
这一行为就是 Amazon SQS 自己的行为(可见性超时、ChangeMessageVisibility、死信队列)。