我有一个Node.js应用程序,它将来自外部CRM的客户端数据同步到应用程序数据库。
应用程序每半小时触发一次CRON作业,并基本上通过CRM的API提取客户端数据。这个“同步”代码必须进行非常大量的调用才能收集所需的所有数据。
使用promises进行API调用通常使用Promise.all函数在异步庄园中执行多个promise。
我的代码的简化部分如下所示。 promise.all方法用于为我的数据库中的每个客户端调用 processReferrals 方法
return db.entities.clients.findAll({ where: {company: company.id}}).then((theClients) => {
var changes = [];
var rPromises = [];
theClients.forEach(client => {
rPromises.push(CharityLogService.processReferrals(client,company));
});
return Promise.all(rPromises).then((values) => {
values.forEach(v => {
changes.push(v);
});
return changes;
});
})
.catch(function (err) {
return [];
});
processReferrals 方法本身然后调用外部API以返回“引用”数据。每个引用都有多个'actions',所以这个方法也有嵌套调用另一个方法,再次通过Promises.all
processReferrals: function(client,company) {
var options = {
uri: "https://externalapi.com/getclientreferrals" + client.id,
headers: {
'company': company.id
},
json: true
};
var actionPromises = [];
return server.httprequest(options)
.then(function (referrals) {
referrals.forEach(referral => {
actionPromises.push(Service.ActionPromiseMethod(referral.id,company));
})
return Promise.all(actionPromises).then((actiondata) => {
return actiondata;
});
})
.catch(function (err) {
console.log('ERROR: api fail error: " + err);
var changes = {};
return new Promise((resolve, reject) => {
changes.clientId = client.id;
console.log("returning changes API FAIL..");
resolve(changes);
});
});
}
这种方法在具有相当少量数据的开发环境中运行良好。但是,当它被部署到具有大量数据的实时环境(以及随后的更多API调用)时,我遇到了问题。
代码似乎间歇性地工作,成功返回某些客户端的数据,然后失败并显示其他错误消息
错误:api失败错误:客户端未定义
我有点疑惑客户端对象如何在此处变为未定义。
我正在AWS Elastic Beanstalk(EC2)上托管我的应用程序。我不完全确定这是一个代码问题,因为结果是间歇性的,并且在开发环境中100%成功。
由于需要在实时环境中进行大量调用,我的AWS实例是否需要升级/升级?
这里有任何指示都很棒。