4

我计划将我的 lambda 函数配置从环境变量移动到 DynamoDb,因为我的 lambda 函数共享配置,而且我不想在每次配置更改时重新部署我的 lambda 函数(我的配置经常更改,一旦他们这样做我必须重新部署这么多 lambda 函数)。

但是为了提高我的 lambda 函数的性能并降低成本,我不会在每次执行时加载配置。相反,我会将配置加载到全局变量中,并且由于全局变量在执行过程中持续存在(只要 lambda 函数已预热),我可以在不访问 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 关闭并面临冷启动之前,预热的 lambda 函数将继续使用旧配置。

我想要做的是向 lambda 函数发出信号并强制它们刷新其预热的 lambda 函数并在每次配置更改时重新开始。我知道我可以重新部署它们,这正是我想要的。但这正是我一开始要逃避的地方。那么,我有哪些选择?

4

1 回答 1

1

您可以使用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
  }
});

注意:确保在函数处理程序之外初始化节点缓存实例

于 2019-03-19T15:29:59.650 回答