【问题标题】:aws sqs lambda: messages not re-appearingaws sqs lambda:消息没有重新出现
【发布时间】:2019-02-02 03:13:30
【问题描述】:

我遵循了使用 sqs 触发器的标准 aws lambda 创建。 然后我将消息发送到 sqs 队列,然后启动 lambda,然后将其写入标准输出。都很好。

问题是:我还没有删除收到的消息,我希望消息在 60 秒的可见期(默认)后再次出现以进行处理。这没有发生,想知道为什么。

package main

import (
    "context"
    "fmt"
    "github.com/aws/aws-lambda-go/events"
    "github.com/aws/aws-lambda-go/lambda"
)

func handler(ctx context.Context, sqsEvent events.SQSEvent) error {

    for _, message := range sqsEvent.Records {
        fmt.Println("Id", message.MessageId)
        fmt.Println("Source", message.EventSource)
        fmt.Println("Body", message.Body)
    }

    return nil
}

func main() {
    lambda.Start(handler)
}

【问题讨论】:

  • 抱歉,您是否在等待触发 lambda 的同一消息再次触发 lambda?
  • 是的。我假设如果 lambda 无法处理消息,那么该消息应该重新出现以进行重新处理,因为我还没有删除它。它应该如何工作?!
  • 但是您的 lambda 在处理消息时并没有失败。如果您希望它失败,您可以调用 panic 或从您的处理程序返回错误(nil 表示一切顺利)
  • 哦,我明白了,让我试试吧!
  • 你是对的,谢谢你,两次

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


【解决方案1】:

从与 OP 的对话中得出答案

问题:Op 想要检查 SQS 在事件失败时如何重试向 lambda 发送事件。 Op 提供了用 Go 编写的 lambda 函数的代码

问题:前提是 lambda 不会失败,因此不会发生重试行为。

解决方案:重写 lambda 使其始终失败。

    func handler(ctx context.Context, sqsEvent events.SQSEvent) error {

    for _, message := range sqsEvent.Records {
        fmt.Println("Id", message.MessageId)
        fmt.Println("Source", message.EventSource)
        fmt.Println("Body", message.Body)
    }

    return error.New("Song by B.S.")
    }

【讨论】:

  • 但这不会导致 lambda 函数重试吗?
  • 我认为 OP 只是使用 SQS 触发器尝试/学习 lambda,否则编写这样的函数是不切实际的
【解决方案2】:

默认情况下,如果您的 lambda 成功,它将自动从队列中删除消息。如果要将消息保留在队列中,则必须使用回调和错误或 context.fail 显式地使 lambda 失败

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-03
    • 2020-02-14
    • 2019-10-17
    • 1970-01-01
    • 2022-01-25
    • 1970-01-01
    • 2019-10-09
    相关资源
    最近更新 更多