Retry优雅的失败重试策略

2024-02-11 12:38

本文主要是介绍Retry优雅的失败重试策略,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

从零开始nodejs系列文章,将介绍如何利Javascript做为服务端脚本,通过Nodejs框架web开发。Nodejs框架是基于V8的引擎,是目前速度最快的Javascript引擎。chrome浏览器就基于V8,同时打开20-30个网页都很流畅。Nodejs标准的web开发框架Express,可以帮助我们迅速建立web站点,比起PHP的开发效率更高,而且学习曲线更低。非常适合小型网站,个性化网站,我们自己的Geek网站!!

关于作者

  • 张丹(Conan), 程序员Java,R,PHP,Javascript
  • weibo:@Conan_Z
  • blog: http://blog.fens.me
  • email: bsspirit@gmail.com

转载请注明出处:
http://blog.fens.me/nodejs-retry

nodejs-retry

前言

异常,在程序设计中是至关重要的,但经常会被设计的过于复杂!

有时候,我们调用一个网络访问的函数,各种原因造成访问失败,会获得一个异常。这个异常可能是请求超时,也许重连一次就好了。代码中,我们会用到try..catch..finally,当应用中异常的规则不断增加,单纯的try..catch控制的重试就显得不够用了。

retry包,可以非常简单地帮助我们封装需要“重试”的函数。

目录

  1. retry介绍
  2. retry安装
  3. retry的API介绍
  4. retry使用

1. retry介绍

retry是一个nodejs库,帮助用户可以自定义失败的操作策略。

retry源代码:https://github.com/tim-kos/node-retry

2. retry安装

系统环境

  • win7 64bit
  • Nodejs:v0.10.5
  • Npm:1.2.19

安装retry


~ D:\workspace\javascript>mkdir nodejs-retry && cd nodejs-retry~ D:\workspace\javascript\nodejs-retry>npm install retry
npm http GET https://registry.npmjs.org/retry
npm http 304 https://registry.npmjs.org/retry
retry@0.6.0 node_modules\retry

3. retry的API介绍

options配置

  • retries:最大重试次数,默认10
  • factor:指数因子使用,默认2
  • minTimeout: 第一次重试前等待时间,默认1000ms
  • maxTimeout: 间隔两次重试的等待时间,默认Infinity
  • randomize: 随机化超时时间,默认false

超时计算公式

var Math.min(random * minTimeout * Math.pow(factor, attempt), maxTimeout);
  • retry.operation([options]): 创建一个RetryOperation对象
  • retry.timeouts([options]): 返回一个超时列表,所有时间都是毫秒
  • new RetryOperation(timeouts): 创建RetryOperation对象
  • retryOperation.errors(): 返回被retryOperation.retry()处理的,所有错误列表
  • retryOperation.mainError(): 返回一个越多发生的错误对象
  • retryOperation.attempt(fn, timeoutOps): 封装一个功能函数到retry,当出错后,会重试功能函数
  • retryOperation.retry(error): 判断是否需要重试。error=true,要重试,error=false,不要重试
  • retryOperation.attempts(): 返回已重试次数

4. retry使用

我们构造一个简单的网络爬虫,分别爬取baidu首页和facebook首页。由于在中国facebook被禁止访问,因此我们的爬虫是连接不到facebook的,会一直报错。retry会监听到这个错误,并自动地实现重试的操作。

新建文件app.js


~ vi app.jsvar retry = require('retry'), http = require('http');function get(url, cb) {var options = {hostname: url,port: 80,method: 'GET'};var req = http.request(options, function (res) {console.log('STATUS: ' + res.statusCode);console.log('HEADERS: ' + JSON.stringify(res.headers));res.setEncoding('utf8');res.on('data', function (chunk) {
//            console.log('BODY: ' + chunk);});});req.on('error', function (e) {console.log('problem with request: ' + e.message);cb(e.message);});req.end();}function retryGet(url, cb) {var operation = retry.operation();operation.attempt(function (currentAttempt) {console.log("Connect Times:" + currentAttempt + ":" + url);get(url, function (err) {if (operation.retry(err)) {return;}cb(err ? operation.mainError() : null);});});
}
var baidu = "www.baidu.com";
retryGet(baidu);var facebook = "www.facebook.com";
retryGet(facebook);

启动程序


~ D:\workspace\javascript\nodejs-retry>node app.js
Connect Times:1:www.baidu.com
Connect Times:1:www.facebook.com
STATUS: 200
HEADERS: {"date":"Mon, 16 Dec 2013 02:50:38 GMT","content-type":"text/html","transfer-encoding":"chunked","connection":"
Keep-Alive","vary":"Accept-Encoding","set-cookie":["BAIDUID=C2AC6E4F1F722771064C91DB1D7FAF74:FG=1; expires=Thu, 31-Dec-3
7 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com","BDSVRTM=0; path=/","H_PS_PSSID=4534_1455_4321_4414_4262_
4451; path=/; domain=.baidu.com"],"p3p":"CP=\" OTI DSP COR IVA OUR IND COM \"","expires":"Mon, 16 Dec 2013 02:50:20 GMT"
,"cache-control":"private","server":"BWS/1.1","bdpagetype":"1","bdqid":"0xc5ae42689eea7b73","bduserid":"0"}
problem with request: connect ETIMEDOUT
Connect Times:2:www.facebook.com
problem with request: connect ETIMEDOUT
Connect Times:3:www.facebook.com
problem with request: connect ETIMEDOUT
Connect Times:4:www.facebook.com
problem with request: connect ETIMEDOUT
Connect Times:5:www.facebook.com
problem with request: connect ETIMEDOUT
Connect Times:6:www.facebook.com
problem with request: connect ETIMEDOUT
Connect Times:7:www.facebook.com
problem with request: connect ETIMEDOUT
Connect Times:8:www.facebook.com

我们看到程序运行的情况,确实如我们所预料的。抓取百度首页,第一次就成功了,只运行了一次。而抓取facebook,由于一直不成功,所以会反复地重试。

retry会极大地帮助了我们处理这种不稳定连接的操作,定义自己的失败重试策略。

转载请注明出处:
http://blog.fens.me/nodejs-retry

这篇关于Retry优雅的失败重试策略的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/699802

相关文章

浅析Java中如何优雅地处理null值

《浅析Java中如何优雅地处理null值》这篇文章主要为大家详细介绍了如何结合Lambda表达式和Optional,让Java更优雅地处理null值,感兴趣的小伙伴可以跟随小编一起学习一下... 目录场景 1:不为 null 则执行场景 2:不为 null 则返回,为 null 则返回特定值或抛出异常场景

SpringRetry重试机制之@Retryable注解与重试策略详解

《SpringRetry重试机制之@Retryable注解与重试策略详解》本文将详细介绍SpringRetry的重试机制,特别是@Retryable注解的使用及各种重试策略的配置,帮助开发者构建更加健... 目录引言一、SpringRetry基础知识二、启用SpringRetry三、@Retryable注解

MySQL 分区与分库分表策略应用小结

《MySQL分区与分库分表策略应用小结》在大数据量、复杂查询和高并发的应用场景下,单一数据库往往难以满足性能和扩展性的要求,本文将详细介绍这两种策略的基本概念、实现方法及优缺点,并通过实际案例展示如... 目录mysql 分区与分库分表策略1. 数据库水平拆分的背景2. MySQL 分区策略2.1 分区概念

SpringKafka错误处理(重试机制与死信队列)

《SpringKafka错误处理(重试机制与死信队列)》SpringKafka提供了全面的错误处理机制,通过灵活的重试策略和死信队列处理,下面就来介绍一下,具有一定的参考价值,感兴趣的可以了解一下... 目录引言一、Spring Kafka错误处理基础二、配置重试机制三、死信队列实现四、特定异常的处理策略五

Pyserial设置缓冲区大小失败的问题解决

《Pyserial设置缓冲区大小失败的问题解决》本文主要介绍了Pyserial设置缓冲区大小失败的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录问题描述原因分析解决方案问题描述使用set_buffer_size()设置缓冲区大小后,buf

SpringBoot利用@Validated注解优雅实现参数校验

《SpringBoot利用@Validated注解优雅实现参数校验》在开发Web应用时,用户输入的合法性校验是保障系统稳定性的基础,​SpringBoot的@Validated注解提供了一种更优雅的解... 目录​一、为什么需要参数校验二、Validated 的核心用法​1. 基础校验2. php分组校验3

Docker镜像pull失败两种解决办法小结

《Docker镜像pull失败两种解决办法小结》有时候我们在拉取Docker镜像的过程中会遇到一些问题,:本文主要介绍Docker镜像pull失败两种解决办法的相关资料,文中通过代码介绍的非常详细... 目录docker 镜像 pull 失败解决办法1DrQwWCocker 镜像 pull 失败解决方法2总

SpringBoot如何通过Map实现策略模式

《SpringBoot如何通过Map实现策略模式》策略模式是一种行为设计模式,它允许在运行时选择算法的行为,在Spring框架中,我们可以利用@Resource注解和Map集合来优雅地实现策略模式,这... 目录前言底层机制解析Spring的集合类型自动装配@Resource注解的行为实现原理使用直接使用M

pip无法安装osgeo失败的问题解决

《pip无法安装osgeo失败的问题解决》本文主要介绍了pip无法安装osgeo失败的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 进入官方提供的扩展包下载网站寻找版本适配的whl文件注意:要选择cp(python版本)和你py

Redis 内存淘汰策略深度解析(最新推荐)

《Redis内存淘汰策略深度解析(最新推荐)》本文详细探讨了Redis的内存淘汰策略、实现原理、适用场景及最佳实践,介绍了八种内存淘汰策略,包括noeviction、LRU、LFU、TTL、Rand... 目录一、 内存淘汰策略概述二、内存淘汰策略详解2.1 ​noeviction(不淘汰)​2.2 ​LR