Функция AWS Lambda запрашивает SQS MessageId и ApiGateway

Вызов URL-адреса моего шлюза API запускает функцию Lambda, которая вставляет сообщение, переданное в SQS, и возвращает идентификатор сообщения в очереди. Теперь я создал еще один ресурс API Gateway и через другую функцию Lambda распечатал все сообщения в очереди. Это функция:

import boto3
import json

def lambda_handler(event, context):

    sqs = boto3.resource('sqs')
    queue = sqs.get_queue_by_name(QueueName='<queue_name>')

    messages = set()
    for m in range(0, 9):
        msg_list = queue.receive_messages()
        for msg in msg_list:

            messages.add(msg.body)

    return list(messages)

Как я могу изменить функцию, чтобы получить только сообщение с указанным идентификатором? Как мне настроить Api Gateway для получения этого параметра и передачи его функции Lambda?


person xergiopd    schedule 03.01.2017    source источник


Ответы (1)


SQS — это не база данных, вы не можете «запросить» ее. Если вам нужно получить сообщение по какому-то ключу, вам лучше использовать хранилище ключ-значение. И ElastiCache Redis, и DynamoDB отлично подходят для такой работы.

person Sergey Kovalev    schedule 03.01.2017
comment
хорошо, но можно ли получить только сообщение с определенным идентификатором? - person xergiopd; 03.01.2017
comment
@xergiopd: я не вижу никаких атрибутов в ReceiveMessage, которые позволили бы вам указать идентификатор сообщения. docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/ Как указал Сергей, извлечение определенного сообщения SQS по идентификатору на самом деле не является вариантом использования, для которого SQS разработан, поскольку это система очередей. - person Dave Maple; 03.01.2017
comment
Вы можете сохранить свое сообщение с предопределенным ключом в S3, а затем вместо этого извлечь сообщение обратно с помощью этого ключа. Вы также можете использовать DynamoDB или RDS, которые хорошо подходят для того, чего вы пытаетесь достичь. - person Dave Maple; 03.01.2017
comment
@xergiopd Теоретически можно получить сообщение с определенным messageId. Вы можете начать получать все сообщения по одному, но не удалять их. Как только вы получили сообщение с определенным messageId, вы обрабатываете и удаляете его. Остальные сообщения вернутся в очередь после VisibilityTimeout окна. Теперь, когда вы знаете, что это возможно, я должен сказать: это самый глупый способ обработки очереди SQS в мире. - person Sergey Kovalev; 03.01.2017
comment
хорошо, я понимаю, что был неправ, и спасибо за комментарии, хотя последнее немного «слишком тяжелое» - person xergiopd; 04.01.2017