服务
关于
CloudProse博客

2017年1月2日星期一

如您所知,Lambda函数在包含的环境中运行。但是,你呢 可能 不知道的是,该环境也经常被重用于后续调用。

To demonstrate this, we created a Node.js Lambda function with the following 码 and ran it multiple times. 我们鼓励您继续这样做。

var someGlobal;exports.handler = (event, context, callback) => { if (someGlobal) { console.log('Global variable:', someGlobal); } else { console.log('Global variable not set, setting it now'); someGlobal = 'First invocation at ' + new Date(); } callback(null, 'Success');};


**This is the result from running the above 码 twice.**

首次调用:

<pre><code>START RequestId:3c48ced7-9616-11e6-bed8-cb583a02e96a版本:$ LATEST2016-12-19T16:08:12.759Z 3c48ced7-9616-11e6-bed8-cb583a02e96a未设置全局变量,请立即进行设置END RequestId:3c48ced7-9616-11e6- bed8-cb583a02e96aREPORT RequestId:3c48ced7-9616-11e6-bed8-cb583a02e96a时长:40.26 ms计费时间:100 ms内存大小:128 MB已使用的最大内存:5 MB</code></pre>


*第二次调用:*

<pre><code>START RequestId:46d7bf5f-9616-11e6-b4a9-bdf95f494d0c版本:$ LATEST2016-12-19T16:08:30.354Z 46d7bf5f-9616-11e6-b4a9-bdf95f494d0c全局变量:2016年10月19日星期三首次调用+0000(UTC)END RequestId:46d7bf5f-9616-11e6-b4a9-bdf95f494d0cREPORT RequestId:46d7bf5f-9616-11e6-b4a9-bdf95f494d0c持续时间:0.88 ms计费持续时间:100 ms内存大小:128 MB使用的最大内存:5 MB</code></pre>


**有两件事要注意。**

首先,请小心使用全局变量。如果您在本地开发和运行该功能,则可能使用类似 lambda-local , 节点lambda , 或者 无服务器框架 ,则全局变量将在每次运行时未初始化。但是,当运行在Lambda上部署的函数时,全局变量可以在一次调用到另一次调用之间保留其状态。这会咬你 ws 如果您不小心的话。

Suppose you want to time how long your function takes to run. You could write 码 like this:

var startTime = +new Date();exports.handler = (event, context, callback) => { doTheWork(); console.log('The work took %d milliseconds', (+new Date() - startTime)); callback(null, 'Success');};


第一次将正确运行,但是对于随后的时间,开始时间变量可能会保留其值并在日志中给出错误的时间。相反,您应该在处理函数中移动变量声明或初始化。

其次,可以使用全局变量进行缓存。例如,假设我们为客户端开发了一种无服务器API,其中一个功能可在DynamoDB表中查找用户权限。因为我们希望用户数量保持较小,所以不必扫描每次在DynamoDB表中调用lambda函数的用户,而是仅扫描表(假设它仅消耗1个读取单元)并缓存结果长达15分钟。

这大大减少了用户表上所需的必需预配置读取,并减少了Lambda执行时间和总体API延迟。

喜欢那声音吗?查看 我们在GitHub上的实现 了解更多。

作者
 乔尔·豪伯德Trek10
乔尔·豪伯德