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

How to implement a priority queue using 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

By "when a msg fails",如果你的意思是 "processing failure" 那么你可以查看 SQS 附带的死信队列 (DLQ) 功能。您可以设置接收计数阈值以将失败的消息移至 DLQ。每个 DLQ 都与一个 SQS 相关联。

在您的情况下,您可以使 "max receive count" = 1 并单独处理该消息

看看原来的问题,我们需要有一个优先级 retry 队列,这意味着:

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

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

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

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