【问题标题】:How to implement a priority queue using SQS(Amazon simple queue service)如何使用 SQS(亚马逊简单队列服务)实现优先级队列
【发布时间】:2015-05-12 06:41:22
【问题描述】:

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

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

谢谢!

【问题讨论】:

    标签: python boto priority-queue amazon-sqs


    【解决方案1】:

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

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

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

        据我所知,AWS SQS 不提供原生方式或执行优先级队列(单队列优先级)。如果您愿意考虑其他选项,RabbitMQ 可以这样做。客户可以在消息中指定 0-255 的优先级,队列将优先级更高的消息优先发送给客户。

        更多信息请关注https://www.rabbitmq.com/priority.html

        【讨论】:

          【解决方案4】:

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

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

          我不确定这是否真的可以作为答案 8^)

          【讨论】:

          • 是的,单 SQS 队列无法做到这一点。 SQS 假定项目是无序的,它们不提供 FIFO 保证。
          • SQS 现在提供了 FIFO 功能,但是您不能将消息设置为跳到队列前面,它是严格的先进先出。 docs.aws.amazon.com/AWSSimpleQueueService/latest/…
          猜你喜欢
          • 2011-07-15
          • 2010-11-03
          • 1970-01-01
          • 1970-01-01
          • 2014-01-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多