Что происходит с goroutines в aws-lambda при выходе из функции обработчика? - PullRequest
0 голосов
/ 16 мая 2018

Возникает вопрос: сколько работы я могу выполнить в фоновом режиме, когда ответ уже отправлен. Например: я просто хочу получить данные, сказать клиенту «хорошо» и продолжить некоторые операции с базой данных, которые могут занять некоторое время.

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)
}

Можем ли мы рассчитывать, что горутин сможет выполнять свою работу?

1 Ответ

0 голосов
/ 16 мая 2018

Оказывается, мы не можем предполагать, что код будет работать.

Пример реализации:

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)
    }
}

Поведение: пока контейнер, в котором работает лямбда, принимает запросы,горутин будет казнен.Но весь код будет остановлен, когда контейнер больше не будет получать запросы.

Возможный вывод (в облачном хранилище):

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Лямбда, чтобы заморозить процесс вскоре после вызова обратного вызова, даже если в цикле событий есть события: Свойства объекта контекста .

Было бы интересно увидеть некоторые варианты использования для этогоAPI.

Обновление: в Node.js, как только вы подключитесь к базам данных, у вас будет непустая очередь событий.Вот почему этот параметр доступен.

...