【问题标题】:Best way to delete messages from SQS during development在开发过程中从 SQS 中删除消息的最佳方法
【发布时间】:2011-12-04 13:05:00
【问题描述】:

在开发过程中,我在我的 Amazon SQS 上生成了大量虚假消息。我正要编写一个小应用程序来删除所有消息(我在开发过程中经常这样做)。有人知道清除队列的工具吗?

【问题讨论】:

    标签: amazon-sqs


    【解决方案1】:

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

    1. 右键单击队列> configure queue
    2. Message Retention period 更改为 1 分钟(可以设置的最短时间)。
    3. 等待所有消息消失。

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

    【讨论】:

    【解决方案2】:

    截至 2014 年 12 月,sqs 控制台的队列操作菜单中现在有一个清除队列选项。

    【讨论】:

    • 在设置了延迟属性的 SQS 队列和客户端长轮询该队列的 AWS 控制台上进行了尝试。 PurgeQueue 没有清除消息。不得不停止长轮询客户端并手动删除这些消息。
    【解决方案3】:

    对于任何来这里的人,正在寻找一种在 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 来执行这些一次性命令
    【解决方案4】:

    检查队列中的第一项。向下滚动到队列中的最后一项。 按住shift,点击项目。将全部选中。

    【讨论】:

    • 大笑
    【解决方案5】:

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

    【讨论】:

    • 感谢 Pradeep- 很好的回答,但我不能冒队列不可用的风险。我不确定 AWS 如何删除和重新创建、命名 URL 等。也许这完全没问题,而且几乎是瞬间删除和重新创建,我只是不敢尝试。
    • 值得注意的是,删除队列后,SQS 不允许在 60 秒内创建同名队列。
    • 这可行,但由于 60 秒的延迟,不利于自动化
    【解决方案6】:

    我认为最好的方法是将保留期更改为 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())
    

    【讨论】:

      【解决方案7】:

      选项 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)
      

      【讨论】:

        【解决方案8】:

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

        步骤:

        • 导航到服务 -> SQS
        • 按您的“QUEUE_NAME”过滤队列
        • 右键单击您的队列名称 -> 清除队列

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

        请参阅下文了解如何执行此操作:

        【讨论】:

          【解决方案9】:
          猜你喜欢
          • 1970-01-01
          • 2018-10-24
          • 2018-11-30
          • 1970-01-01
          • 2012-04-28
          • 2012-08-25
          • 2011-04-21
          • 2015-09-28
          • 2015-04-23
          相关资源
          最近更新 更多