如何使用SQS实现优先级队列(Amazon简单队列服务)

时间:2015-03-10 17:29:08

标签: python boto priority-queue amazon-sqs

我遇到一个msg失败的情况,我想使用python boto包重放那个具有最高优先级的msg,这样他就会被带走。如果我没错,SQS队列不支持优先级队列,所以我想实现一些简单的东西。

重要说明:当msg失败时我不再拥有消息对象,我只保留receipt_handle,这样我就可以删除消息(如果有超过x次重试)/更改超时可见性为了把他推回队列。

谢谢!

4 个答案:

答案 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。

  1. 假设您的消息采用 JSON 格式,并且包含一个 Priority 字段。将其添加到您的 SQS。
  2. 在消费者处,获取消息,对其进行处理,如果失败,则将可见性超时设置为(优先级)*(60 分钟) queue
  3. 为队列设置 maxReceiveCount 等于您需要的重试次数或配置保留期以在特定重试次数后将消息移至死信队列。

因此,理论上,低优先级请求在开始时可能只在高优先级之前执行一次,然后使用可见性超时将其“移动到”高优先级消息之后。