Как заставить перезагрузить глобальные переменные лямбда-функции? - PullRequest
1 голос
/ 19 марта 2019

Я планирую перенести конфигурацию своей лямбда-функции из переменных среды в DynamoDb, поскольку мои лямбда-функции совместно используют конфигурации, а также я не хочу повторно развертывать свои лямбда-функции каждый раз, когда меняется конфигурация (моя конфигурация часто меняется и после того, как они это делают Я должен перераспределить так много лямбда-функций).

Но для того, чтобы улучшить производительность моих лямбда-функций, а также снизить стоимость, я не собираюсь загружать конфигурацию для каждого выполнения. Вместо этого я загружу конфигурацию в глобальную переменную, и поскольку глобальные переменные сохраняются при выполнении (до тех пор, пока лямбда-функция разогревается), я могу повторно использовать эту конфигурацию, не обращаясь к DynamoDb. Вот пример кода:

let config = null;
function getConfig() {
    if (config)
        return Promise.resolve(config);
    else {
        //Load config from DynamoDb and return it in form of a promise
    }
}

exports.handler = function(event, context, callback) {   
    getConfig()
        .then(config => {
            //Your code that makes use of config
        })
}

Пока все в порядке. Теперь рассмотрим время, когда DynamoDb обновляется с новой конфигурацией. Разогретые лямбда-функции будут продолжать использовать старую конфигурацию, прежде чем они будут отключены AWS и столкнутся с холодным стартом.

Что я хочу сделать, так это сигнализировать о лямбда-функциях и заставлять их сбрасывать прогретые лямбда-функции и запускаться каждый раз при изменении конфигурации. Я знаю, что могу перераспределить их, что будет делать именно то, что я хотел. Но это именно то, от чего я вообще сбежал. Итак, какие у меня варианты?

1 Ответ

1 голос
/ 19 марта 2019

Вы можете использовать node-cache , чтобы достичь того, что вы хотите сделать.Значения, установленные этой библиотекой, сохранятся, если ваша функция будет разогрета, и истекут после установленного TTL.

Использование довольно простое, оно будет выглядеть примерно так:

//try get from cache
cache.get(key, function(error, data) {
  if (error) {
    //handle error
  }
  if (!data) {
    //value not found in cache, so load values here
    //and then set using cache.set
    cache.set(key, data, TTL, function(error, success) {
      if (error) {
        //handle error
      }
      if (success) {
        //handle success
      }
    });
  }
  else {
    //value found in cache
  }
});

Примечание: Убедитесь, что вы инициализируете экземпляр кеша узла вне вашего обработчика функции

...