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并发编程之如何优雅关闭钩子Shutdown Hook

《Java并发编程之如何优雅关闭钩子ShutdownHook》这篇文章主要为大家详细介绍了Java如何实现优雅关闭钩子ShutdownHook,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起... 目录关闭钩子简介关闭钩子应用场景数据库连接实战演示使用关闭钩子的注意事项开源框架中的关闭钩子机制1.

Spring Boot中JSON数值溢出问题从报错到优雅解决办法

《SpringBoot中JSON数值溢出问题从报错到优雅解决办法》:本文主要介绍SpringBoot中JSON数值溢出问题从报错到优雅的解决办法,通过修改字段类型为Long、添加全局异常处理和... 目录一、问题背景:为什么我的接口突然报错了?二、为什么会发生这个错误?1. Java 数据类型的“容量”限制

SpringBoot基于配置实现短信服务策略的动态切换

《SpringBoot基于配置实现短信服务策略的动态切换》这篇文章主要为大家详细介绍了SpringBoot在接入多个短信服务商(如阿里云、腾讯云、华为云)后,如何根据配置或环境切换使用不同的服务商,需... 目录目标功能示例配置(application.yml)配置类绑定短信发送策略接口示例:阿里云 & 腾

redis过期key的删除策略介绍

《redis过期key的删除策略介绍》:本文主要介绍redis过期key的删除策略,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录第一种策略:被动删除第二种策略:定期删除第三种策略:强制删除关于big key的清理UNLINK命令FLUSHALL/FLUSHDB命

Java实现优雅日期处理的方案详解

《Java实现优雅日期处理的方案详解》在我们的日常工作中,需要经常处理各种格式,各种类似的的日期或者时间,下面我们就来看看如何使用java处理这样的日期问题吧,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言一、日期的坑1.1 日期格式化陷阱1.2 时区转换二、优雅方案的进阶之路2.1 线程安全重构2

使用Python实现一个优雅的异步定时器

《使用Python实现一个优雅的异步定时器》在Python中实现定时器功能是一个常见需求,尤其是在需要周期性执行任务的场景下,本文给大家介绍了基于asyncio和threading模块,可扩展的异步定... 目录需求背景代码1. 单例事件循环的实现2. 事件循环的运行与关闭3. 定时器核心逻辑4. 启动与停

浅析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错误处理基础二、配置重试机制三、死信队列实现四、特定异常的处理策略五