我在nodejs中使用无服务器。我有lambda函数,其中包含大约6个API。 除一个外,所有API均正常工作。但是,这种无法正常工作的api在本地无服务器离线环境中仍然可以正常工作。在服务器中部署后,它的行为就会延迟。 这是我在api函数中所做的工作的骨架
let rec_list = await db.sequelize.query(query).spread(rec_list => { return rec_list; }).catch((e)=>{
console.log("error");
throw e;
})
let rec_list2= rec_list .map((rec_list_sub) => {
//some assignment here
//let new_var = {}; // just assignment - no db operation
return new_var;
});
let resultArr = await Promise.all(rec_list2).then((result) => {
return result;
}).catch((e) => {
throw e;
});
let tem_list = await db.mymodel.bulkCreate(resultArr).then(function (li) {
selectedIds = li.map(({ id }) => {
return {
reqId: id,
description: 'sent',
status: 0
}
});
return li;
}).catch(function (err) {
throw err;
});
//send fcm push
//triggering push notification to user
fcm_send_msg("success", "body-message-here",["fdsfdsfdsf-device-id"]); //*--> Push notification is not triggered. When i hit any of api from this same lambda function, then previously called apis' push notification triggered.*
如果我在bulkcreate调用之前放置了aysnc(尝试/不等待)的推送通知函数调用,则它正在工作,但批量创建被延迟。
lambda函数的执行时间为6秒,但仅花费了108ms。分配的内存为1024mb,但仅使用了120mb。
答案 0 :(得分:0)
我要作一个很多个假设,所以如果我完全不了解,请告诉我,我将删除此答案。我假设您的lambda在VPC中运行,因为它正在访问数据库。从您的问题中,我理解您的意思是,当调用“ bulkCreate”发生在对“ fcm_send_msg”的调用之前时,您遇到此问题,但是当调用“ fcm_send_msg”发生在对“ bulkCreate”的调用之前时,您会收到通知,但是批量创建仍然被延迟。
我怀疑您可能存在权限问题。 Lambda使用临时端口范围进行呼叫,因此您需要确保安全组和NACL允许Lambda可能从其发起呼叫的完整临时端口范围。参见https://docs.aws.amazon.com/vpc/latest/userguide/vpc-network-acls.html#nacl-ephemeral-ports:
AWS Lambda函数使用端口1024-65535。
您可以检查Lambda的CloudWatch日志(通过监视)以查看其工作情况,并且如果您在日志中看到似乎有故障的事物并且正在重试,则很可能表明呼叫正在被执行由于安全组或NACL不允许通信而被阻止。