我打算将我的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的时间。热身的lambda函数将继续使用旧的配置,然后由AWS关闭并面临冷启动。
我想要做的是发出lambda函数的信号并强制它们刷新它们的热量lambda函数,并在每次配置更改时重新开始。我知道我可以重新部署它们,这将完全符合我的要求。但这正是我从一开始就逃避的原因。那么,我的选择是什么?
您可以使用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
}
});
注意:确保在函数处理程序之外初始化节点缓存实例