【问题标题】:How do I return a message back to SQS from lambda trigger如何从 lambda 触发器将消息返回给 SQS
【发布时间】:2019-05-17 08:02:24
【问题描述】:

我有从 SQS 队列读取消息的 lambda 触发器。在某些情况下,消息可能尚未准备好进行处理,因此我想将消息放回队列中等待 1 分钟,然后重试。目前,我正在创建此客户记录的另一个副本并将此新副本发布到队列中。我是否有理由/方式将原始记录保留在队列中,而不是创建新记录

def postToQueue(customer):

    if 'attemptCount' in customer.keys():
        attemptCount = int(customer["attemptCount"]) + 1
    else:
        attemptCount = 2
    customer["attemptCount"] = attemptCount

    # Get the service resource
    sqs = boto3.resource('sqs')

    # Get the queue
    queue = sqs.get_queue_by_name(QueueName='testCustomerQueue')
response = queue.send_message(MessageBody=json.dumps(customer), DelaySeconds=60)

    print('customer postback: ', customer)
    print ('response from writing ot the queue is: ', response)

#main function
for record in event['Records']:
    if 'body' in record.keys():
        customer = json.loads(record['body'])
        print("attempting to process customer", customer, " at: ", datetime.datetime.now())
        if (not ifReadyToProcess(customer)):
            postToQueue(customer)
        else:
            processCustomer(customer)

【问题讨论】:

    标签: aws-lambda amazon-sqs


    【解决方案1】:

    这不是 SQS 触发 Lambda 函数的理想设置。

    我的测试表明,发送到 SQS 的消息将立即触发 Lambda 函数,即使提供了延迟设置。因此,将消息放回 SQS 队列将导致 Lambda 立即再次触发。

    为避免出现 Lambda 不断检查消息是否已准备好处理的情况,我建议:

    • 使用 Amazon CloudWatch Events 按计划(例如每 2 分钟)触发 Lambda 函数
    • Lambda 函数应从队列中提取消息并检查它们是否已准备好进行处理。
      • 如果它们准备好了,则处理它们并删除它们
      • 如果它们没有准备好,则使用 延迟 设置将它们推回队列并删除原始消息

    请注意,这与让 SQS 直接触发 Lambda 不同。相反,Lambda 函数应该调用ReceiveMessages() 来获取消息本身,这允许延迟函数在检查之间增加一些时间。

    另一种选择:您可以通过删除消息来简单地利用默认可见性超时设置,而不是将消息重新插入队列。从队列中读取但未删除的消息将自动“重新出现”在队列中。您可以将其用作“重试”时间段。但是,这意味着您将需要自己处理死信(例如,如果在 n 次尝试后无法处理消息)。

    【讨论】:

    • 谢谢。您能否澄清一下我如何阅读并将消息推回队列中。这正是我正在寻找的。 “Lambda 函数应该从队列中提取消息并检查它们是否准备好处理。如果它们准备好了,则处理它们并删除它们如果它们还没有准备好,则使用延迟设置将它们推回队列并删除原始消息”
    • 你并没有真正“把他们推回去”。相反,您将一条新消息推送到队列中。 Delay 参数将在所需的时间段内隐藏它,因此当 Lambda 代码从队列中提取消息时它们不会出现。请注意,这与让 SQS 直接触发 Lambda 不同。您的 Lambda 函数可以使用 receive_message()send_message()
    猜你喜欢
    • 1970-01-01
    • 2019-08-16
    • 2022-01-06
    • 2019-08-24
    • 2020-07-17
    • 1970-01-01
    • 2018-09-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多