【问题标题】:AWS Lambda function query SQS MessageId and ApiGatewayAWS Lambda 函数查询 SQS 消息 Id 和 Api 网关
【发布时间】:2017-01-03 13:49:02
【问题描述】:

调用我的 Api Gateway 的 url 会触发一个 Lambda 函数,该函数插入在 SQS 中传递的消息并返回队列中消息的 id。 现在我创建了另一个 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)

如何更改函数以仅获取具有指定 id 的消息? 然后我如何配置 Api 网关来接收这个 参数并将其传递给 Lambda 函数?

【问题讨论】:

    标签: python aws-lambda amazon-sqs aws-api-gateway boto3


    【解决方案1】:

    SQS 不是数据库,您不能“查询”它。如果您需要通过某个键检索消息,则最好使用键值存储。 ElastiCache Redis 和 DynamoDB 都非常适合此类工作。

    【讨论】:

    • 好的,但是否可以只获取具有特定 id 的消息?
    • @xergiopd:我在 ReceiveMessage 上看不到任何允许您指定 messageId 的属性。 docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/… 正如 Sergey 指出的那样——通过 ID 提取特定的 SQS 消息并不是 SQS 的真正用例,因为它是一个排队系统。
    • 您可以使用预定义的密钥将消息存储在 S3 中,然后通过该密钥将消息拉回。您还可以使用 DynamoDB 或 RDS,它们都非常适合您想要完成的任务。
    • @xergiopd 理论上,可以检索带有特定messageId 的消息。您可以开始一一检索所有消息,但不能删除它们。收到带有特定 messageId 的消息后,您将处理并删除它。其他消息将在VisibilityTimeout 窗口之后返回队列。既然知道有可能,那我不得不说:这是世界上最傻的处理SQS队列的方式了。
    • 好的,我明白我错了,感谢 cmets,虽然最后一点“太重了”
    猜你喜欢
    • 2018-08-03
    • 1970-01-01
    • 1970-01-01
    • 2016-09-05
    • 1970-01-01
    • 1970-01-01
    • 2021-12-01
    • 2021-10-03
    • 1970-01-01
    相关资源
    最近更新 更多