【问题标题】:Delete message from SQS DLQ从 SQS DLQ 中删除消息
【发布时间】:2021-04-22 11:28:55
【问题描述】:

如何从具有大约 10k 消息的 SQS DLQ 中删除 MessageId 已知的消息?

我尝试使用 lambda 函数来实现,但使用它可以接收的最大消息只有 10 条。

最好的方法是什么?

【问题讨论】:

  • 您要删除所有消息还是只删除部分消息?如果有一些消息,你有所有的消息 ReceiptHandle 吗?

标签: amazon-web-services aws-lambda amazon-sqs


【解决方案1】:

您的问题似乎只针对一条消息,但无论如何,您都可以使用 deleteMessageBatch 方法。在节点服务器中,您将拥有:

const AWS = require("aws-sdk");

const messageIds = ["1", "2", "3"];

const removeNotificationFromQueueData = messageIds.map((id) => {
  return {
    ReceiptHandle: id,
    Id: id,
  };
});

const sqs = new AWS.SQS();

sqs
  .deleteMessageBatch({
    QueueUrl: "http://myQueueUrlEndpoint",
    Entries: removeNotificationFromQueueData,
  })
  .promise();

【讨论】:

    【解决方案2】:

    使用python脚本的另一种方式

    #!/usr/bin/env python
    import boto3
    
    
    def delete_msg_id(queue_url, message_id):
        """Delete message based on message ID
    
        :param queue_url: URL of the SQS queue to read.
        :param message_id: message id to be deleted
        """
        sqs_client = boto3.client("sqs")
    
        while True:
            resp = sqs_client.receive_message(
                QueueUrl=queue_url, AttributeNames=["All"], MaxNumberOfMessages=10, WaitTimeSeconds=1
            )
    
            for msg in resp["Messages"]:
                try:
                    if msg["MessageId"] == message_id:
                        sqs_client.delete_mesage(QueueUrl=queue_url, ReceiptHandle=msg["ReceiptHandle"])
                except KeyError:
                    print('failed')
                    continue
    
    
    if __name__ == '__main__':
        delete_msg_id('my_sqs_url', 'my_msg_id')
    

    参考Moving Big Number Of Messages Between SQS Queues

    【讨论】:

      猜你喜欢
      • 2019-01-24
      • 2012-04-28
      • 1970-01-01
      • 2015-04-23
      • 2020-03-24
      • 2012-08-25
      • 1970-01-01
      • 2016-04-29
      • 2018-11-30
      相关资源
      最近更新 更多