我遇到一个msg失败的情况,我想使用python boto包重放那个具有最高优先级的msg,这样他就会被带走。如果我没错,SQS队列不支持优先级队列,所以我想实现一些简单的东西。
重要说明:当msg失败时我不再拥有消息对象,我只保留receipt_handle,这样我就可以删除消息(如果有超过x次重试)/更改超时可见性为了把他推回队列。
谢谢!
答案 0 :(得分:9)
我不认为有任何方法可以使用单个SQS队列执行此操作。您无法控制邮件的传递,因此无法对邮件施加优先级。如果你找到了办法,我很乐意听到它。
我认为你可能会使用两个队列(或者更常见的是N队列,其中N是优先级的数量)但是如果你在确定时没有实际拥有消息对象,那么即使这样也是不可能的它失败了。您需要消息对象,以便可以将数据写入高优先级队列。
我不确定这实际上是否有资格作为答案8 ^)
答案 1 :(得分:1)
据我所知,AWS SQS不提供本机方式或执行优先级队列(单队列优先级)。如果您愿意考虑其他选项,RabbitMQ可以执行此操作。客户端可以在消息中指定优先级0-255,队列将优先处理优先级更高的消息,然后优先发送给客户。
有关更多信息,请查看https://www.rabbitmq.com/priority.html
答案 2 :(得分:1)
通过“当消息失败时”,如果您的意思是“处理失败”,则可以查看SQS随附的死信队列(DLQ)功能。您可以设置接收计数阈值,以将失败的消息移至DLQ。每个DLQ都与一个SQS关联。
在您的情况下,您可以将“最大接收数”设为1,然后分别处理该消息
答案 3 :(得分:0)
查看原始问题,我们需要有一个优先重试队列,这意味着:
在这种情况下,是的,我们可以使用带有一些不太重要的假设的 SQS。
因此,理论上,低优先级请求在开始时可能只在高优先级之前执行一次,然后使用可见性超时将其“移动到”高优先级消息之后。