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

相关文章

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

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

Nginx之upstream被动式重试机制的实现

《Nginx之upstream被动式重试机制的实现》本文主要介绍了Nginx之upstream被动式重试机制的实现,可以通过proxy_next_upstream来自定义配置,具有一定的参考价值,感兴... 目录默认错误选择定义错误指令配置proxy_next_upstreamproxy_next_upst

Spring Retry 实现乐观锁重试实践记录

《SpringRetry实现乐观锁重试实践记录》本文介绍了在秒杀商品SKU表中使用乐观锁和MybatisPlus配置乐观锁的方法,并分析了测试环境和生产环境的隔离级别对乐观锁的影响,通过简单验证,... 目录一、场景分析 二、简单验证 2.1、可重复读 2.2、读已提交 三、最佳实践 3.1、配置重试模板

MySQL安装时initializing database失败的问题解决

《MySQL安装时initializingdatabase失败的问题解决》本文主要介绍了MySQL安装时initializingdatabase失败的问题解决,文中通过图文介绍的非常详细,对大家的学... 目录问题页面:解决方法:问题页面:解决方法:1.勾选红框中的选项:2.将下图红框中全部改为英

Nginx启动失败:端口80被占用问题的解决方案

《Nginx启动失败:端口80被占用问题的解决方案》在Linux服务器上部署Nginx时,可能会遇到Nginx启动失败的情况,尤其是错误提示bind()to0.0.0.0:80failed,这种问题通... 目录引言问题描述问题分析解决方案1. 检查占用端口 80 的进程使用 netstat 命令使用 ss

pip install jupyterlab失败的原因问题及探索

《pipinstalljupyterlab失败的原因问题及探索》在学习Yolo模型时,尝试安装JupyterLab但遇到错误,错误提示缺少Rust和Cargo编译环境,因为pywinpty包需要它... 目录背景问题解决方案总结背景最近在学习Yolo模型,然后其中要下载jupyter(有点LSVmu像一个

Deepseek使用指南与提问优化策略方式

《Deepseek使用指南与提问优化策略方式》本文介绍了DeepSeek语义搜索引擎的核心功能、集成方法及优化提问策略,通过自然语言处理和机器学习提供精准搜索结果,适用于智能客服、知识库检索等领域... 目录序言1. DeepSeek 概述2. DeepSeek 的集成与使用2.1 DeepSeek API

Redis的数据过期策略和数据淘汰策略

《Redis的数据过期策略和数据淘汰策略》本文主要介绍了Redis的数据过期策略和数据淘汰策略,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录一、数据过期策略1、惰性删除2、定期删除二、数据淘汰策略1、数据淘汰策略概念2、8种数据淘汰策略

SpringBoot中的404错误:原因、影响及解决策略

《SpringBoot中的404错误:原因、影响及解决策略》本文详细介绍了SpringBoot中404错误的出现原因、影响以及处理策略,404错误常见于URL路径错误、控制器配置问题、静态资源配置错误... 目录Spring Boot中的404错误:原因、影响及处理策略404错误的出现原因1. URL路径错

Redis多种内存淘汰策略及配置技巧分享

《Redis多种内存淘汰策略及配置技巧分享》本文介绍了Redis内存满时的淘汰机制,包括内存淘汰机制的概念,Redis提供的8种淘汰策略(如noeviction、volatile-lru等)及其适用场... 目录前言一、什么是 Redis 的内存淘汰机制?二、Redis 内存淘汰策略1. pythonnoe