在开发过程中,从SQS中删除消息的最佳方法是什么?

19

在开发过程中,我在我的Amazon SQS上产生了很多虚假消息。我打算编写一个小应用程序来删除所有消息(这是我在开发过程中经常做的事情)。有人知道一个清空队列的工具吗?

9个回答

50

如果您不想编写脚本或删除队列,您可以更改队列配置:

  1. 右键单击队列 > 配置队列
  2. 消息保留期 更改为1分钟(可设置的最短时间)。
  3. 等待一段时间,直到所有消息消失。

我发现这种方法可以很好地删除队列中的所有消息而不删除队列本身。


该值必须介于1分钟和14天之间。我将我的设置为1分钟,需要等大约10分钟才能让消息从https://console.aws.amazon.com/sqs/home?region=us-east-1上最终消失。这是个很好的技巧!谢谢!另请参见https://dev59.com/6lzUa4cB1Zd3GeqP4pMH#7893892。 - Ryan
2
方便的技巧,但现在在队列操作下有一个“清除队列”选项。 - Jamie Hall

11
截至2014年12月,SQS控制台中的队列操作菜单现已增加了清空队列选项。

http://aws.amazon.com/about-aws/whats-new/2014/12/08/delete-all-messages-in-an-amazon-sqs-queue/ - Ramson Tutte
尝试在设置了延迟属性并使用长轮询的SQS队列上从AWS控制台执行此操作。PurgeQueue未清除消息。必须停止长轮询客户端并手动删除这些消息。 - Ramson Tutte

8

对于任何想要找到C#批量删除SQS消息的人...

//C# Console app which deletes all messages from a specified queue
//AWS .NET library required.

using System;
using System.Net;
using System.Configuration;
using System.Collections.Specialized;
using System.IO;
using System.Linq;
using System.Text;

using Amazon;
using Amazon.SQS;
using Amazon.SQS.Model;
using System.Timers;

using System.Collections.Generic;
using System.Text.RegularExpressions;
using System.Diagnostics;

namespace QueueDeleter
{
    class Program
    {
        public static System.Timers.Timer myTimer;
        static NameValueCollection appConfig = ConfigurationManager.AppSettings;
        static string accessKeyID = appConfig["AWSAccessKey"];
        static string secretAccessKeyID = appConfig["AWSSecretKey"];
        static private AmazonSQS sqs;

        static string myQueueUrl = "https://queue.amazonaws.com/1640634564530223/myQueueUrl";
        public static String messageReceiptHandle;

        public static void Main(string[] args)
        {
            sqs = AWSClientFactory.CreateAmazonSQSClient(accessKeyID, secretAccessKeyID);

            myTimer = new System.Timers.Timer();
            myTimer.Interval = 10;
            myTimer.Elapsed += new ElapsedEventHandler(checkQueue);
            myTimer.AutoReset = true;
            myTimer.Start();
            Console.Read();
        }

        static void checkQueue(object source, ElapsedEventArgs e)
        {
            myTimer.Stop();

            ReceiveMessageRequest receiveMessageRequest = new ReceiveMessageRequest();
            receiveMessageRequest.QueueUrl = myQueueUrl;
            ReceiveMessageResponse receiveMessageResponse = sqs.ReceiveMessage(receiveMessageRequest);
            if (receiveMessageResponse.IsSetReceiveMessageResult())
            {
                ReceiveMessageResult receiveMessageResult = receiveMessageResponse.ReceiveMessageResult;

                if (receiveMessageResult.Message.Count < 1)
                {
                    Console.WriteLine("Can't find any visible messages.");
                    myTimer.Start();
                    return;
                }

            foreach (Message message in receiveMessageResult.Message)
            {
                Console.WriteLine("Printing received message.\n");

                messageReceiptHandle = message.ReceiptHandle;

                Console.WriteLine("Message Body:");
                if (message.IsSetBody())
                {
                    Console.WriteLine("    Body: {0}", message.Body);
                }
                sqs.DeleteMessage(new DeleteMessageRequest().WithQueueUrl(myQueueUrl).WithReceiptHandle(messageReceiptHandle));
            }
        }
        else
        {
            Console.WriteLine("No new messages.");
        }

         myTimer.Start();
        }
    }
}

此时最好使用AWS SQS CLI来执行这些一次性命令。 - Don Cheadle

5

检查队列中的第一项。向下滚动到队列中的最后一项。 按住 Shift 键,单击该项。所有内容都将被选中。


3
大声笑,简写为LOL。 - Roberto

4

我认为最好的方法是删除队列并重新创建,只需要2个请求。


1
谢谢Pradeep,你的回答很好,但我不能冒险队列不可用。我不确定AWS如何删除和重新创建,命名URL等。也许这是完全可以接受的,而且几乎是瞬间删除和重新创建,但我太害怕尝试了。 - Hairgami_Master
12
值得注意的是,在您删除队列之后,SQS 不会让您在 60 秒内使用相同的名称创建队列。 - teedyay
这个可以运行,但由于60秒的延迟,不适合自动化。 - Stephan

1

选项1:boto sqs为Python提供了purge_queue方法:

purge_queue(queue)
Purge all messages in an SQS Queue.

Parameters: queue (A Queue object) – The SQS queue to be purged
Return type:    bool
Returns:    True if the command succeeded, False otherwise

来源: http://boto.readthedocs.org/en/latest/ref/sqs.html

适用于我的代码:

conn = boto.sqs.connect_to_region('us-east-1',
          aws_access_key_id=AWS_ACCESS_KEY_ID,
          aws_secret_access_key=AWS_SECRET_ACCESS_KEY,
)
q = conn.create_queue("blah")
#add some messages here

#invoke the purge_queue method of the conn, and pass in the
#queue to purge.
conn.purge_queue(self.queue)

对我来说,它删除了队列。然而,Amazon SQS仅允许您每60秒运行一次此操作。因此,我不得不使用下面的备选方案:
选项2:通过在while循环中消耗所有消息并将其丢弃来进行清除:
    all_messages = []
    rs = self.queue.get_messages(10)
    while len(rs) > 0:
        all_messages.extend(rs)
        rs = self.queue.get_messages(10)

1
我认为最好的方法是将保留期更改为1分钟,但如果有人需要,这里是Python代码:
#!/usr/bin/python
# -*- coding: utf-8 -*-

import boto.sqs
from boto.sqs.message import Message
import time
import os

startTime = program_start_time = time.strftime("%Y-%m-%d %H:%M:%S", time.gmtime())

### Lets connect to SQS:
qcon = boto.sqs.connect_to_region(region,aws_access_key_id='xxx',aws_secret_access_key='xxx')
SHQueue = qcon.get_queue('SQS')
m = Message()
### Read file and write to SQS
counter = 0
while counter < 1000:   ## For deleting 1000*10 items, change to True if you want delete all
    links = SHQueue.get_messages(10)
    for link in links:
            m = link
            SHQueue.delete_message(m)
    counter += 1
#### The End
print "\n\nTerminating...\n"
print "Start: ", program_start_time
print "End time: ", time.strftime("%Y-%m-%d %H:%M:%S", time.gmtime())

0

0

如果您可以访问AWS控制台,您可以使用Web UI清除队列。

步骤:

  • 导航到服务 -> SQS
  • 按“QUEUE_NAME”筛选队列
  • 右键单击队列名称 -> 清除队列

这将请求清除队列,并且应该在5或10秒左右完成。

请参阅以下有关如何执行此操作的说明:

Purge queue manually


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接