假设我的工作时间从10秒到40秒不等 可见性超时设置为30秒。
作业在40秒内完成,因此消息重新进入队列,其他工作人员可以看到。
现在用了40秒的工作人员删除了该消息。
感谢。
答案 0 :(得分:1)
如果消费者在其可见性超时到期之前保留邮件,则将其删除 将其从队列中删除... 通常。
<强> DeleteMessage可以强>
从指定的队列中删除指定的消息。您可以使用邮件的收据句柄而不是发送邮件时收到的MessageId来指定邮件。即使消息由于可见性超时设置而被其他阅读器锁定,它仍然会从队列中删除。
到目前为止,这么好,对吧?
但是有一个明显的警告。
注意强>
收据句柄与接收邮件的特定实例相关联。如果您不止一次收到邮件,则每次收到邮件时收到的收据句柄都不同。如果在使用
DeleteMessage
操作时未提供最近收到的邮件收据句柄,则请求会成功,但邮件可能不会被删除。
没有解释为什么“可能不会”被删除,但有几个原因可以想到:
可能是SQS不记得删除句柄的无限回归。如果消费者收到相同的消息,比如说,576个不同的时间,那么很久以前已经被SQS丢弃了(例如)第16个顺序发布的删除句柄是有道理的...
或者,它可能是SQS分布式架构的一个怪癖。对于非FIFO队列,服务的设计是这样的:在任何内部不一致的情况下,SQS总是希望确保消息“至少一次”被传递和删除,并且从操作的角度来看,2个传递是远远超过0送货。
这里的含义是,接收消息的最后一个消费者应该删除它,并且任何先前收到并持续太久的消费者删除它的尝试也可能会成功。