当处理程序函数退出时,aws-lambda中的goroutines会发生什么?

时间:2018-05-16 07:01:53

标签: node.js go aws-lambda

问题源于:我已经在后台做了多少工作,何时已经发送了回复。例如:我只想接收数据,告诉客户“确定”,然后继续进行一些可能需要一些时间的数据库操作。

package main

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

type MyEvent struct {
        Name string `json:"name"`
}

func HandleRequest(ctx context.Context, name MyEvent) (string, error) {
        go RecordQuery(name)
        return fmt.Sprintf("Hello %s!", name.Name ), nil
}

func RecordQuery(name MyEvent) {
        // insert stuff in the database, mark user active,
        // log activity, etc..
}

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

我们可以指望goroutine能够完成它的工作吗?

1 个答案:

答案 0 :(得分:2)

事实证明我们不能假设代码会运行。

示例实施:

var alreadyLogging bool

func RecordQuery(name MyEvent) {
    if alreadyLogging {
        return
    }
    alreadyLogging = true
    for i := 0; ; i++ {
        time.Sleep(time.Second)
        log.Print("Still here ", i)
    }
}

行为:只要运行lambda的容器正在接收请求,就会执行goroutine。但是当容器不再接收请求时,所有代码都将停止。

可能的输出(在cloudwatch中):

2018/05/16 08:50:46 Still here 70
2018/05/16 08:50:47 Still here 71
2018/05/16 08:50:48 Still here 72
2018/05/16 08:50:49 Still here 73
2018/05/16 08:51:36 Still here 74
2018/05/16 08:51:37 Still here 75
2018/05/16 08:51:38 Still here 76

请注意,在Node.js编程模型中,即使事件循环中存在事件,您也可以请求AWS Lambda在调用回调后立即冻结该过程:The Context Object Properties

查看此API的一些用例会很有趣。

更新:在Node.js中,一旦连接到数据库,您就会有一个非空的事件队列。这就是为什么这个设置可用的原因。