现在应用开发中,大量的数据交互是通过web接口传输的,而系统外部的接口存在大量不可控因素,不一定都处于长期可用状态,某一时刻,访问接口传数据出错怎么处理呢?
这个不好给出固定的对策,要跟数据源提供方和使用方共同确定,其实应该是数据owner说了算。
首先不管成功与否,都应该记录日志返回信息或者出错信息。
如果需要重新传输的话,需要定义一下重传策略,比如几分钟之后再次尝试,尝试几次,这几次之间时间间隔是怎样的。或者保存到需要重传的队列中,定时重传或者人工调用时重传。也可以是这些重传策略的结合方式。
下面给一个例子,重传队列持久化到本地json文件,计划任务重传,也支持接口调用重传
var retrylist = require('./retrylist.json');
let rule=new schedule.RecurrenceRule();
rule.hour=[8,17];
rule.minute=[30];
rule.second=0;
function redeal(){
let testlist=JSON.parser(JSON.stringify(retrylist));
retrylist=[]
let retryPromise = async.mapLimit(testlist, jargs.mclimit, (item, callback)=>{
axios.post(jargs.webif,item).then(res => { callback(null, item); }).catch(e =>{ retrylist.push(item); fs.writeFileSync('./retrylist.json', JSON.stringify(retrylist)); callback(e, item); });
});
mergePromise.then(res => { logger.info("清空队列 "); fs.writeFileSync('./retrylist.json', JSON.stringify([])); })
.catch(e =>{ logger.error("重传出错 "); });
}
let job=schedule.scheduleJob(rule,() => {
logger.info("开始重传任务")
redeal();
});
app.post('/sendretryitem',jsonParser,(req,res)=>{
if (req.ip != jargs.authip0) {
logg.info("非授权访问 "+req.ip);
res.json({ "msg" : "非授权访问!" });
}
else {
let args=req.body;
logger.info("收到重传消息 "+JSON.stringify(args));
retrylist.push(args)
fs.writeFileSync('./retrylist.json', JSON.stringify(retrylist));
res.json({ "msg" : "收到重传消息" });
}
})
app.post('/reflush',(req,res)=>{
if (req.ip != jargs.authip0) {
logg.info("非授权访问 "+req.ip);
res.json({ "msg" : "非授权访问!" });
}
else {
redeal();
res.json({ "msg" : "收到重传消息" });
}
})