如何使用 SQS(Amazon Simple Queue Service)实现优先级队列



我遇到消息失败的情况,我想使用 python boto 包重播具有最高优先级的味精,以便他首先被带走。如果我没记错的话,SQS 队列不支持优先级队列,所以我想实现一些简单的东西。

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

谢谢!

我认为没有任何

方法可以使用单个 SQS 队列来做到这一点。 您无法控制消息的传递,因此无法对消息施加优先级。 如果你找到一种方法,我很想听听。

我认为您可以使用两个队列(或者更一般地说是 N 个队列,其中 N 是优先级的数量),但如果在确定消息对象失败时实际上没有消息对象,即使这样似乎也是不可能的。 您将需要消息对象,以便可以将数据写入高优先级队列。

我不确定这实际上是否有资格作为答案 8^)

据我所知,AWS SQS 不提供本机方式或执行优先级队列(单队列优先级)。如果您愿意考虑其他选择,RabbitMQ 可以做到这一点。客户端可以在消息中指定优先级 0-255,队列将优先处理优先级较高的消息,该消息将首先到达客户。

欲了解更多信息,请查看 https://www.rabbitmq.com/priority.html

通过"当消息失败时",如果您的意思是"处理失败",那么您可以查看 SQS 附带的死信队列 (DLQ) 功能。您可以设置接收计数阈值以将失败的消息移动到 DLQ。每个 DLQ 都与一个 SQS 相关联。

在您的情况下,您可以使"最大接收计数" = 1,然后单独处理该消息

查看原始问题,我们需要有一个优先重试队列,这意味着:

  • 队列中的项目应优先排序,因为低优先级项目可能依赖于高优先级项目,例如,只有在成功处理高优先级项目后才能成功处理低优先级项目;
  • 我们需要为队列项目实现多次重试;

在这种情况下是的,我们可以将 SQS 与一些不太重要的假设一起使用。

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

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

最新更新