AWS SQS可以发布到SNS还是轮询所需的SQS?

时间:2018-02-15 01:12:11

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

我们目前正在使用AWS构建应用程序,并且需要将msgs推送到SQS。我的问题是,是否有可能让SQS向SNS发布消息,该消息将触发Lambda(向SNS发送)?然后lambda需要向收到消息的SQS返回一个肯定,从而从SQS中删除该消息。

上面列出的情景是否可行?或者是从SQS获取消息,通过Lambda等轮询队列的唯一方法吗?

提前感谢您提供的任何帮助。

对滥用术语表示歉意,但我对AWS相对较新。

3 个答案:

答案 0 :(得分:0)

SQS无法向SNS发布消息。 SQS只能存储消息。您必须使用SQS Api来提取消息。

希望这对你有所帮助!

答案 1 :(得分:0)

SQS不支持推送。但是,您可以设置一个lambda函数,该函数可以非常简单地定期从SQS轮询:https://cloudonaut.io/integrate-sqs-and-lambda-serverless-architecture-for-asynchronous-workloads/

答案 2 :(得分:0)

对于将来偶然发现此问题的任何人,在将SQS用作SNS-> Lambda服务的无效信之后,我必须编写此脚本。它不是最漂亮的代码,但可以。

下面是脚本,但您也可以在这里找到它:https://gist.github.com/joshghent/ca4a1272031e2a52af57d5e8ec5d53c5

sqs_to_sns.py

# Usage
# $ python sqs_to_sns.py my-queue-name

import boto3
import sys
import queue
import threading
from datetime import datetime
import json
from uuid import uuid4

work_queue = queue.Queue()

sqs = boto3.resource('sqs')
sns = boto3.client('sns')
sqs_client = boto3.client('sqs')

from_q_name = sys.argv[1]
print(("From: " + from_q_name + " To: SNS"))

from_q = sqs.get_queue_by_name(QueueName=from_q_name)
to_q = sqs.get_queue_by_name(QueueName='backup-queue')

skipped = 0
processed = 0
total = 0


def process_queue():
    while True:
        messages = work_queue.get()

        global total
        total = len(messages)

        for message in messages:
            message_content = json.loads(message.body)

            message.delete()

            print("Backing up Message to dead letter queue - just in case. Id: " +
                  message_content['MessageId'])
            bodies = list()
            bodies.append({'Id': str(uuid4()), 'MessageBody': message.body})

            to_q.send_messages(Entries=bodies)

            response = sns.publish(
                TopicArn=message_content['TopicArn'], Message=message_content['Message'])
            print(("Published Message to Topic " + str(message_content['MessageId']) +
                   ". To TopicArn: " + message_content['TopicArn'] + ". Received response " + json.dumps(response)))

            global processed
            processed = processed + 1


for i in range(10):
    t = threading.Thread(target=process_queue)
    t.daemon = True
    t.start()

while True:
    messages = list()
    for message in from_q.receive_messages(
            MaxNumberOfMessages=10,
            VisibilityTimeout=123,
            WaitTimeSeconds=20):
        messages.append(message)
    work_queue.put(messages)

work_queue.join()
print("Processed " + str(processed) + " of " + str(total) +
      ". Skipped " + str(skipped) + " messages. Exiting")