nodejs异步请求重试策略总结
对于node开发同学经常要处理异步请求,然后根据请求的结果或请求成功后的状态码做不同的策略处理,众多策略中最常用的一种就是重试策略。针对重试策略我们往往还需要设定一定的规则,如重试次数、重试时间间隔、总体超时时间、重试判定等。针对以上问题,这里推荐一个工具包:bluebird-retry。
bluebird-retry基本用法如下:
var retry = require('bluebird-retry');
function logFail() {
console.log(new Date().toISOString());
throw new Error('bail');
}
retry(logFail, { max_tries: 4, interval: 500 });
结果如下:
2014-05-29T23:16:28.941Z
2014-05-29T23:16:29.445Z
2014-05-29T23:16:29.946Z
2014-05-29T23:16:30.447Z
Error: operation timed out
以上代码逻辑是,如果logFail函数报出异常或出错,则重试四次,每次间隔500毫秒。
bluebird-retry除了能够捕获异常外,还支持promise形式:
var Promise = require('bluebird');
var retry = require('bluebird-retry');
var count = 0;
function myfunc() {
console.log('myfunc called ' + (++count) + ' times');
if (count < 3) {
return Promise.reject(new Error('fail the first two times'));
} else {
return Promise.resolve('succeed the third time');
}
}
retry(myfunc)
.then(function(result) {
console.log(result);
});
最终结果:
myfunc called 1 times
myfunc called 2 times
myfunc called 3 times
succeed the third time
他对promise的支持就为我们的异步请求处理打开了大门,我们可以将bluebird,request,bluebird-retry三者结合起来,针对异步请求做重试策略:
var Promise = require('bluebird');
var request = Promise.promisifyAll(require('request'));
var retry = require('bluebird-retry');
var config = require('../config/config');
var log = require('../log');
module.exports = function(options, method) {
options.timeout = options.timeout || config.requestTimeout;
var predicate = options.predicate || function(error) {
log.fatal('GET#' + method +'*retryError#-1#' + options.url + '#error:' + error.stack);
return error && error.toString() && error.toString().indexOf('ETIMEOUT') > -1;
};
delete options.predicate;
return retry(function(){
log.notice('GET#' + method +'*retry#' + options.url);
return request.getAsync(options);
}, {
max_tries: 3,
interval: 200,
backoff: 2,
predicate: predicate//对错误过滤处理,只有符合条件的错误才会做重试策略,比如超时
});
}
以上代码就是只针对超时错误做重试处理。
如果你还有其他场景,比如对返回结果判断status,如果status不为0则重试,那么你只需要在适当时候抛出异常即可。可以参考如下实例:
function getToken(userId){
console.log("GET#getToken*start#userId:" + userId);
log.notice("GET#getToken*start#userId:" + userId);
return bluebirdRetry(function() {// 获取token,失败则重试三次
console.log("GET#getToken*retryStart#userId:" + userId);
log.notice("GET#getToken*retryStart#userId:" + userId);
return request.getAsync({
url: config.server.wxToken,
timeout: config.requestTimeout
}).then(function(response) {
var result = JSON.parse(response.body);
if (!result || result.returnValue !== 0) {// 如果status不为0则重试三次
console.log('GET#getToken*retryError#-1#url:' +
config.server.wxToken + '#userId:' + user +
'#error:' + (result && util.obj2ParamsString(result)));
log.fatal('GET#getToken*retryError#-1#url:' +
config.server.wxToken + '#userId:' + user +
'#error:' + (result && util.obj2ParamsString(result)));
throw new Error('getToken Error');
} else {
return result
}
});
}, {
max_tries: 3,
interval: 200,
backoff: 2
})
.then(function(result) {
console.log("GET#getToken*end#userId:" + userId + "#token:" + util.obj2ParamsString(result));
log.notice("GET#getToken*end#userId:" + userId + "#token:" + util.obj2ParamsString(result));
return result;
})
.catch(function(err) {
log.fatal("GET#getToken*error#userId:" + userId + "#token:" + config.server.wxToken + '#' + err);
log.fatal("GET#getToken*error#userId:" + userId + "#token:" + config.server.wxToken + '#' + err);
return {};
});
}
然而有时候并不是所有的情况都想做重试,有些错误情况需要即可失败以便通知开发人员,这时候只要抛出throw new bluebirdRetry.StopError('GetWXImg Error!');即可,示例如下:
var retry = require('bluebird-retry');
var i = 0;
var err;
var swing = function() {
i++;
console.log('strike ' + i);
if (i == 3) {
throw new retry.StopError('yer out');
}
throw new Error('still up at bat');
};
retry(swing, {timeout: 10000})
.caught(function(e) {
console.log(e.message)
});
执行结果:
strike 1
strike 2
strike 3
yer out
关于他的详细文档可以参考:https://www.npmjs.com/package/bluebird-retry
关于node中错误和异常的处理策略可以参考:http://cnodejs.org/topic/55714dfac4e7fbea6e9a2e5d
nodejs异步请求重试策略总结的更多相关文章
- ajax异步请求/同源策略/跨域传值
基本概念 Ajax 全称是异步的 JavaScript 和 XML . 通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新.这意味着可以在不重新加载整个网页的情况下,对网页的某部分进 ...
- OKHttp源码学习同步请求和异步请求(二)
OKHttp get private void doGet(String method, String s) throws IOException { String url = urlAddress ...
- 关于HttpClient重试策略的研究
一.背景 由于工作上的业务本人经常与第三方系统交互,所以经常会使用HttpClient与第三方进行通信.对于交易类的接口,订单状态是至关重要的. 这就牵扯到一系列问题: HttpClient是否有默认 ...
- ASIHTTP 框架,同步、 异步请求、 上传 、 下载
ASIHTTPRequest详解 ASIHTTPRequest 是一款极其强劲的 HTTP 访问开源项目.让简单的 API 完成复杂的功能,如:异步请求,队列请求,GZIP 压缩,缓存,断点续传,进度 ...
- Node.js之路【第三篇】NodeJS异步实现
NodeJS异步实现 Node.js异步编程的直接体现就是回调,它依托于回调来实现,但不能说使用了回调他就是异步了 回调函数在完成任务后就会被调用,Node使用了大量的回调函数,Node所有的API都 ...
- 网络邂逅&网络异步请求
什么是卡,网络慢,且你只能等着它加载完不能做别的事 这里便引申出网络异步请求的概念 #import "ViewController.h" @interface ViewContro ...
- IOS之同步请求、异步请求、GET请求、POST请求
.同步请求可以从因特网请求数据,一旦发送同步请求,程序将停止用户交互,直至服务器返回数据完成,才可以进行下一步操作, .异步请求不会阻塞主线程,而会建立一个新的线程来操作,用户发出异步请求后,依然可以 ...
- IOS 网络浅析 (二 网络异步请求)
学习网络,无论是C/S还是B/S首要的当然是向服务器发送请求,并得到响应,么有请求没有响应,那就不叫做网络了. 这边文章向大家介绍境界一下网路异步请求. *大家不要觉得我写的知识点太零散,我只是想给大 ...
- Nodejs异步异常处理domain
前言 程序开发中,最麻烦的事情之一就是异常处理:对于Nodejs程序开发,最麻烦的事情莫过于异步异常处理. 以MVC的多层架构设计角度,异常总是要一层一层向上抛出,最后在客户端出打印错误.但是,Nod ...
随机推荐
- L2-025 分而治之(并查集)
分而治之,各个击破是兵家常用的策略之一.在战争中,我们希望首先攻下敌方的部分城市,使其剩余的城市变成孤立无援,然后再分头各个击破.为此参谋部提供了若干打击方案.本题就请你编写程序,判断每个方案的可行性 ...
- go安装依赖包
实例 比如先切换到 $GOPATH 的 src 目录,cd $GOPATH/src,然后按需要下载: git clone --depth 1 https://github.com/golang/too ...
- MVC Request生命周期(综合总结)
当用户在浏览器输入一个URL地址后,浏览器会发送一个请求到服务器.这时候在服务器上第一个负责处理请求的是IIS.然后IIS再根据请求的URL扩展名将请求分发给不同的处理程序处理. 流程如下: 当请求一 ...
- Linux 学习笔记 2:文件系统
1.文件系统层次结构 系统目录内容: /: 根目录(之后的/都是目录分隔符) /home:用户目录 /bin: Unix常用命令,如bash, date, cat, tar等 /sbin: 管理员命令 ...
- FastDFS防盗链
FastDFS扩展模块内置了通过token来实现防盗链的功能.开启防盗链后,访问文件是需要在url中加两个参数:token和ts.ts为时间戳,token为系统根据时间戳和密码生成的信物.为了系统的安 ...
- 利用WMITool解决Windows10 浏览器主页被hao123劫持问题
利用Windows10 激活工具KMS10_1025激活系统之后会出现首页 被劫持的问题 解决办法如下 1.下载wmi tool 连接地址 链接: https://pan.baidu.com/s/1g ...
- Chapter4_控制执行流程
总结java中所有的与流程控制有关的知识 (1)表达式判断 Java中只允许true或者false来作为判断条件,不允许用0或者非0值作为判断条件. (2)if-else 与流程密切相关的语句,决定了 ...
- java31
1.包装类 基本数据类型包装成对象,使基本数据类型的功能更加强大, 基本数据类型 包装类 byte Byte short Short int Integer long Long float Float ...
- squid故障汇总
1.COSS will not function without large file support (off_t is 4 bytes long. Please reconsider recomp ...
- 第五周助教工作总结——NWNU李泓毅
第五周助教总结 注:因第四次实验安排两个标准时间完成,因此本周未提交完整作业. 本周心得: 第四次实验进行过半,八组同学都在实验课上进行了一次中期总结,并形成书面总结在微信群中讨论. 根据各组同学的中 ...