aws лямбда падает при закрытии соединения - PullRequest
0 голосов
/ 10 марта 2020

Я использую golang в лямбда-функции для подключения к Redis. Когда я впервые вызываю лямбду, создается новый пул соединений, и при дальнейших вызовах лямбда, кажется, использует пул для получения соединений. Однако, когда я добавил строку con.close (), второй вызов лямбды завершается сбоем, а третий вызов воссоздает пул. Есть ли риск, если я не закрою соединение? Или я могу закрыть соединение каким-либо другим способом?

Ошибка, которую я получаю в журналах наблюдения за облаком, - это «ошибка времени выполнения, неверный адрес памяти или нулевой указатель» в строке пула. Метод Get () выглядит так, как будто переменная пула ноль?

func newPool(addr string) *redis.Pool {
  return &redis.Pool{
    MaxIdle: 3,
    IdleTimeout: 240 * time.Second,
    // Dial or DialContext must be set. When both are set, DialContext takes precedence over Dial.
    Dial: func () (redis.Conn, error) { return redis.Dial("tcp", addr) },
  }
}

var pool *redis.Pool

func init(){
   pool = newPool()
}



func Handle(ctx context.context, req events.APIGatewayWebsocketProxyRequest)(interface{},error){

  //make new redis connection

  con:= pool.get()

   con.close()

}

Ответы [ 2 ]

0 голосов
/ 10 марта 2020

Как насчет добавления defer con.close() в функцию Handle? потому что после вызова функции Handle она закроет кон.

0 голосов
/ 10 марта 2020

Похоже, что вы закрываете соединение, как только вы открываете соединение, так что да, лямбда убьет себя.

Вы можете сохранить соединение живым с помощью любого oop некоторого рода, обработать затем сообщения выходят из l oop, чтобы закрыть соединение. Что, в свою очередь, снова убило бы лямбду.

Вы могли бы установить свою лямбду на долгоживущий , что просто продолжало бы нести расходы.

Как только ваш метод Handle станет полные лямбды убивают себя.

...