Закройте соединение Redis при завершении функции Google Cloud

Как закрыть соединение с хранилищем памяти Redis из облачной функции при завершении работы экземпляра облачной функции? (Я считаю, что для закрытия мне нужно вызвать redis.quit (), но я просто не знаю, когда, и я не могу закрыть их сразу после возврата функции, потому что экземпляр функции может быть повторно используется)

Поскольку я просто оставляю соединения открытыми, прямо сейчас я получаю ошибку «ECONNRESET».

В качестве альтернативы, если что-то вроде это невозможно:

process.on("exit", function(){//also process is not defined in cloud functions
    redisClient.quit();
});

Лучше всего указать тайм-аут в конфигурации Redis? (Как это сделать в хранилище памяти gcp?)




Ответы (2)


Когда ваша функция входа в облачную функцию возвращается, ваш контейнер может быть прекращен без уведомления.

У вас есть два варианта:

  • Открывать и закрывать соединения при каждом вызове функции
  • Используйте пул подключений и управляйте ошибками подключения, которые противоречат предполагаемому использованию облачных функций.

Если ваши функции поддерживают контейнер в горячем состоянии, объединение пулов соединений с обработкой ошибок «может» иметь преимущество при немалых затратах на обработку ошибок и тестирование всех возможных проблем. Приложения Cloud Functions должны разрабатываться так, чтобы не иметь состояния. Попытка сохранить состояние (соединения, данные и т. Д.) Между вызовами в облачных функциях - не лучшая стратегия.

Я бы спроектировал свою систему, используя вариант №1. Облачные функции «легковесны», что означает запуск, быстрое выполнение задачи и завершение работы.

person John Hanley    schedule 25.08.2019

В Google Cloud Functions не определены прослушиватели жизненного цикла. Каждая облачная функция должна запускаться как можно быстрее и закрывать все открытые ресурсы после завершения обработки.

person Frank van Puffelen    schedule 25.08.2019
comment
Как узнать, когда вызывать redis.quit ()? Если я вызываю его, а затем функция запускается снова, ошибки redis, потому что соединение было закрыто - person Acreol; 25.08.2019
comment
Облачные функции не должны иметь состояния. Поэтому, если вы зависите от Redis, вы должны открывать соединение при запуске функции и закрывать его, когда функция завершается. В качестве альтернативы вы можете открыть соединение по запросу и оставить его открытым, если удаленная служба может с этим справиться, например, реализовать тайм-ауты сокета. - person Frank van Puffelen; 25.08.2019