我当前正在调用 RDS 数据库来获取项目列表,然后循环访问这些项目,然后对每个项目进行 POST 调用。我的问题是:
是否可以循环遍历此列表并为列表中的每个项目调用另一个 Lambda 函数。理想情况下,这不会等待响应,而是会继续呼叫其他人。每个被调用的方法都会继续运行,直到完成。请注意,这是基于 NodeJs 6.10
结构如下:
var pg = require('knex')({
client: 'pg',
connection: process.env.DATABASE_URL,
debug: true
});
// Internal
const time = require('./lib/time');
const response = require('./lib/response');
const helpers = require('./lib/helpers');
module.exports.createBatch = (event, context, cb) => {
// Lambda settings
context.callbackWaitsForEmptyEventLoop = false;
const now = time.getCurrentTime();
pg('table')
.join('table')
.select('*')
.then(function(rows) {
return rows;
})
.then(function(rows) {
console.log( 'rows: ' + rows );
let count = 0;
if (!_.isEmpty(rows)) {
for(let row of rows) {
// ****
// CALL OTHER LAMBDA FUNCTION HERE
// ****
axios.post(row)
.then(function (res) {
// ****
// MOVE THIS POST CALL INTO ANOTHER LAMBDA FUNCTION
// ****
})
}
}
})
您想要使用适用于 Nodejs 的 AWS 开发工具包来调用 Lambda invoke() 函数。传递
InvocationType: Event
参数即可异步调用该函数,无需等待响应。
是的,您可以使用“lambda.invoke”来做到这一点。请参阅此处有关调用的更多详细信息
由于几个原因,您的建议并不理想。即
虽然这种同步流程可以在服务器上的单个应用程序中工作,但它在分布式无服务器架构中引入了几个可以避免的问题:
成本:使用 Lambda,您需要为调用期间付费。在此示例中,当“创建发票”函数运行时,其他两个函数也在等待状态下运行,如图中红色所示。
错误处理:在嵌套调用中,错误处理可能会变得更加复杂。错误要么被抛出到父函数以在顶级函数处处理,要么函数需要自定义处理。例如,创建发票中的错误可能需要处理付款功能来冲销费用,或者可能会重试创建发票流程。
紧密耦合:处理付款通常比创建发票需要更长的时间。在这个模型中,整个工作流程的可用性受到最慢函数的限制。
相反,您可以使用 AWS 步骤函数创建分布式地图作业。您可以阅读更多相关信息这里