【问题标题】:How do I limit the number of messages in my SQS queue?如何限制 SQS 队列中的消息数量?
【发布时间】:2016-05-06 13:21:04
【问题描述】:

我希望那里只有 200 条消息。

所有其他人都应该移动到死信队列。

由于依赖于其他服务,我们只是没有能力处理更多消息。

【问题讨论】:

  • 我不明白这个问题,在这里......根本。如果您现在没有资源来为队列中的消息提供服务,那么在您这样做之前不要从队列中读取。这就是排队的重点——等待你的工作直到你能够处理它。将工作投入死信队列,“稍后”,您提议,似乎没有必要。只需尽可能慢地从队列中读取,以保持在外部系统的限制内......我错过了什么?
  • 您能否提供更多关于您如何将信息发送到“第三方服务”的信息?该服务是从队列中“拉出”,还是您有一个从队列中检索数据并将其“推送”到外部的进程?有什么方法可以查看外部服务是否“准备好”接收更多请求?

标签: amazon-web-services message-queue amazon-sqs


【解决方案1】:

SQS 没有这样的限制功能。

因此,不要尝试在 SQS 级别进行。相反,在您从队列中提取消息时实现此限制逻辑。

跟踪您从队列中提取并发送到第 3 方服务的消息。一旦你达到了你的限制(20 条?),就将这条消息扔掉。

  1. 有一个“正在处理”的消息计数器。
  2. 从队列中拉出一条消息。
  3. 检查计数器,如果小于 20,则增加计数器并将消息发送到 3rd 方服务。
  4. 当第 3 方服务调用返回时,递减计数器。
  5. 当您检查上面 #2 中的计数器并且它是 20 时,请丢弃该消息。

【讨论】:

    【解决方案2】:

    更新

    如果您没有为它们设置延迟可见性,您可以在允许消息通过之前通过cloudwatch API 调用ApproximateNumberOfMessagesVisible

    可从队列中检索的消息数。

    单位:计数

    有效统计数据:平均


    如果您的延迟可见性确实大于0,您可以进行两次检查,第二次检查ApproximateNumberOfMessagesNotVisible

    如果此解决方案不起作用,是的,这似乎有点多,但您可以调用 NumberOfMessagesDeletedNumberOfMessagesSent 并获取仍在队列中的消息数。

    所以(伪)“代码” 看起来像:

    if (ApproximateNumberOfMessagesVisible < 200)
        //Send message
    
    //OR
    
    var x = NumberOfMessagesSent - NumberOfMessagesDeleted;
    
    if (x < 200)
        //Send message
    

    HERE是上述调用的文档



    信息检查?

    再看一遍,我不相信下面的配置能解决这个问题。在确认不正确之前,我会将其保留在答案中。

    我相信在设置过程中可以通过调整Dead Letter Queue Settings

    在 SQS 设置中,您将看到:Use Redrive Policy 声明:

    超过最大接收数后将消息发送到死信队列。

    在其下方:Maximum Receives 声明:

    消息在发送到死信队列之前可以接收的最大次数。

    此设置应将所有溢出发送到一个可选值的辅助队列。所以换句话说,您可以启用Redrive PolicyDead Letter Queue 留空,并将Maximum Receives 设置为200

    【讨论】:

    • 那怎么能让我将他的消息限制为 200 条。
    【解决方案3】:

    您绝对不能限制队列中的消息数量。

    您的应用程序的性质是什么?如果我们更多地了解您需要限制队列大小的原因,也许会有更好的解决方案...

    【讨论】:

    • 消息通过调用另一个 3rd 方服务作为处理的一部分进行处理。该第 3 方服务一次不能处理超过 20 个请求。因此,尝试扩展我的服务毫无意义。稍后我会将额外的负载放入死信队列中。
    【解决方案4】:

    我认为限制队列中的消息数量是不可能的。您可以对队列中消息的大小设置限制,但不能对消息数量进行限制。

    来源:SetQueueAttributes

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-13
      • 2018-04-02
      • 2014-06-29
      • 2014-10-10
      • 2011-04-27
      相关资源
      最近更新 更多