如何限制SQS队列中的消息数量?

时间:2016-01-28 23:01:47

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

我想在那里只有200封邮件。

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

由于依赖其他服务,我们无法处理更多邮件。

4 个答案:

答案 0 :(得分:2)

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

来源:SetQueueAttributes

答案 1 :(得分:2)

您绝对不能限制队列中的邮件数量。

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

答案 2 :(得分:2)

SQS没有这样的限制功能。

所以不要试图在SQS级别上这样做。相反,当您从队列中提取消息时,请实施此限制逻辑。

跟踪从队列中提取的消息并发送到第三方服务。一旦达到极限(20?),然后垃圾消息。

  1. 拥有正在处理的消息的计数器"。
  2. 从队列中提取消息。
  3. 检查计数器,如果计数器小于20,请递增计数器并将消息发送给第三方服务。
  4. 当第三方服务呼叫返回时,递减计数器。
  5. 当您检查上面#2中的计数器及其20时,然后将该消息垃圾。

答案 3 :(得分:0)

<强>更新

如果您没有设置延迟的展示次数,则可以在允许邮件通过之前通过cloudwatch API致电ApproximateNumberOfMessagesVisible

  

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

     

单位:计数

     

有效统计:平均


如果您的可见度延迟大于0,则可以执行两次检查,第二次检查ApproximateNumberOfMessagesNotVisible

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

所以(伪)&#34;代码&#34; 看起来像:

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 Policy留空Dead Letter QueueMaximum Receives设置为200