将数据从一个AWS队列(SQS)复制到另一SQS的最佳方法

时间:2019-05-28 08:41:59

标签: amazon-web-services amazon-sqs

我在相同的帐户和区域中有一个sqs队列,对于一些新功能测试,我已将我的UAT代码部署在具有不同配置的生产环境中,这是一个连接过程,其中一个过程使用SQS将消息传递给另一个。

现在,由于UAT具有不同的SQS队列,但期望与我们在产品队列上发布的消息相同,因此只想检查是否存在可以帮助我将消息复制到不同队列中的配置,而不是显式编写代码

2 个答案:

答案 0 :(得分:1)

选项1:使用Amazon SNS扇出到Amazon SQS队列

如果您有权将消息发送到Amazon SQS队列的过程,则可以对其进行更改:

  • 将消息发送到 Amazon SNS主题
  • 订阅 Amazon SQS队列到SNS主题

这样,当消息发送到SNS时,它将被转发到所有已订阅的SQS队列。这样可以避免在队列之间复制消息。

请确保为原始邮件传递配置SQS订阅,以使它们接收的邮件与原始发送给SNS的邮件完全相同。

选项2:邮件重复

如果您没有能力更改消息的发送方式,而实际上确实需要将消息从一个队列复制到另一个队列,则需要编写一个程序来这样做。它需要:

  • 通过多次调用ReceiveMessages()来获取每条消息,并传递一个高VisibilityTimeout值来遍历源队列
    • 使用SendMessage()将邮件发送到目标队列
    • 请勿删除源消息(这会使消息在一段时间内保持不可见状态)

ReceiveMessage()调用可以指定一个VisibilityTimeout期间。将此值设置得很高,以便直到检索完所有消息后,这些消息才会再次显示。这样可以防止消息被多次处理。

目标队列中的新消息将与源消息不同,因为它们将具有不同的ID和时间戳。但是,消息本身的内容将被保留。

答案 1 :(得分:0)

如果您安装了 AWS CLI 和 jq 工具,那么沿着这些行的 bash 脚本应该可以工作。虽然它会很慢,但对于临时使用来说已经足够了。

#!/bin/bash

#Transfers messages from one SQS queue to another

if [[ $# -ne 2 ]]
then
    echo "usage $0 : from-queue to-queue"
    exit 1
fi

echo getting
aws sqs receive-message --queue-url=$1 >m1
STATUS=$? 
if [[ -s m1 ]]
then 
    cat m1 | jq ".Messages|.[0]|.Body|fromjson" > m1.body
    rh=`cat m1 |  jq ".Messages|.[0]|.ReceiptHandle" |tr -d \"`
    echo sending
    aws sqs send-message --queue-url=$2 --message-body file://m1.body
    echo deleting
    aws sqs delete-message --queue-url=$1  --receipt-handle=$rh
else 
    echo done
fi