面向对象的重试模式方法
目录
背景
重试模式
实现
使用代码
兴趣点
- 下载源代码11 KB
背景
最近,当我在代码中修复某些内容时,偶然发现了重试的实现,该实现是有效的,但效果不是很好。它与该类的实际逻辑交织在一起,使单元测试不必要地变得复杂。实际上,我们的公共库中有一些不错的实现,所以我采用并重用了它。
重试模式
我们的应用程序在其中运行的环境本质上是不可靠的。尤其是当您与应用程序外部的资源(例如服务或存储)进行通信时。这些错误可以是永久性的(找不到资源,或者您无权使用该资源),也可以是暂时性的(超时或您的调用受到限制)。如果可以确定哪个故障是暂时的,则可以自动重试这些操作,而不必将故障返回给调用方。
成功的重试策略必须满足以下要求:
- 确定故障是永久的还是暂时的。
- 如果出现瞬态故障,将自动重试该操作。重试的次数必须限制为不会无限循环,以防万一瞬态故障毕竟不是那么瞬态。
- 在重试之间插入某种延迟,以使资源有一定的恢复空间。
如果您想了解有关重试逻辑的更多信息,请参阅Microsoft Docs上的以下文章:
- 重试一般指南——云应用程序的最佳做法
- 重试模式——云设计模式
实现
让我们从重试策略本身开始。我在这里选择async版本,因为我认为这在当今很普遍。可以很容易地将其重写为不使用任务。而且,将要重试的动作是返回数据。同样,您可能有一个单独的重载而不返回数据,但我的意思并不是要提供完整的实现只是为了展示面向对象的设计。
public interface IRetryStrategy
{Task<T> Execute<T>(Func<Task<T>> action);
}
我们将基于异常处理错误。
public interface IExceptionHandler
{bool IsTransient(Exception ex);
}
最后,我们还有另一个依赖关系来确保重试之间的延迟。
public interface IDelayProvider
{TimeSpan GetNextValue();
}
这是重试策略的简化实现。请查看随附的完整版本代码。在这里,您还可以找到异常处理程序和延迟提供程序的实现。
public async Task<T> Execute<T>(Func<Task<T>> action)
{var retryCounter = 0;while (true){try{return await action();}catch (Exception ex){if (retryCounter >= this.maxRetry || !this.exceptionHandler.IsTransient(ex)){throw;}}retryCounter++;var delay = this.delayProvider.GetNextValue();await Task.Delay(delay);}
}
使用代码
重试策略具有多个依赖关系,我们使用工厂来创建它。通常,您希望它是可配置的(重试次数,延迟次数等),这是使用工厂的另一个参数。这是一个示例,它看起来可能是什么样子,但是您需要根据自己的需要进行定制。
public class RetryStrategyFactory : IRetryStrategyFactory
{public IRetryStrategy Create(){var exceptionHandler = new HttpRequestExceptionHandler();var delayProvider = new ExponentialBackoffDelayProvider(TimeSpan.FromSeconds(0.6), TimeSpan.FromSeconds(6), 2.0);return new RetryStrategy(5, exceptionHandler, delayProvider, new WaitWrapper());}
}
然后,您每次需要执行不可靠的操作时,都可以使用工厂创建重试策略。请注意,您可能希望针对不同的操作采用不同的策略。
public async Task Process()
{var retryStrategy = this.retryStrategyFactory.Create();var data = await retryStrategy.Execute(() =>{// retrieve data});// process data
}
兴趣点
此实现几乎与我们在生产代码中使用的实现相同。您可以争辩说,在面向对象设计方面还有改进的余地,我同意。例如,与接口相比,使用委托非常方便且极为容易,但是如在测试中,进行模拟有点棘手,这表明设计并不理想。我当时正在考虑进一步推动设计,但如果有足够的兴趣,也许以后再考虑。
https://www.codeproject.com/Tips/5292290/Object-oriented-Approach-to-Retry-Pattern
面向对象的重试模式方法相关推荐
- 异步重试_异步重试模式
异步重试 当您有一段经常失败且必须重试的代码时,此Java 7/8库提供了丰富且简洁的API以及针对此问题的快速且可扩展的解决方案: ScheduledExecutorService schedule ...
- android电视工程模式,智能电视如何打开ADB?进入工程模式方法
原标题:智能电视如何打开ADB?进入工程模式方法 ADB调试是智能安卓设备特有的功能之一,一般情况下智能电视ADB调试是默认隐藏关闭的.ADB模式可以使电视与外界设备进行数据传送.例如我们通过远程推送 ...
- PHP面向对象处理请求,PHP面向对象之命令模式
PHP面向对象之命令模式,这个模式主要由 命令类.用户请求数据类.业务逻辑类.命令类工厂类及调用类构成,各个类的作用概括如下: 1.命令类:调用用户请求数据类和业务逻辑类: 2.用户请求数据类:获取用 ...
- 【软件项目管理】用例分析方法采用一种面向对象的情景分析方法
用例分析方法采用一种面向对象的情景分析方法. 传统的结构化分析方法是面向功能的,而面向对象的视点是将系统看作一组服务,将问题看作相互作用的实体.用例分析方法采用面向对象的方法,将现实世界的" ...
- 明日之后 找不到服务器,明日之后登录服务器错误怎么办 登录服务器错误请重试解决方法...
明日之后官方版v1.0安卓版 类型:角色扮演大小:0KB语言:中文 评分:6.6 标签: 立即下载 明日之后今天开启安卓测试,玩家下载游戏就能玩啦,不过很多玩家在进入游戏界面显示登录服务器错误请重试, ...
- 如何禁用C-State功能?关闭intel CPU的C-State省电模式方法
前段时间,Win10电脑经常出现蓝屏故障,蓝屏代码为WHEA_UNCORRECTABLE_ERROR,一开始以为是系统的问题,重新安装系统几次都未能解决这个问题,多次更新驱动也得不到解决,包括内存也更 ...
- iPhone解锁的三种方法【附全型号进入恢复模式方法】
iPhone忘记了屏幕密码锁,导致我们无法解锁使用手机,当我们输入了错误密码次数过多还会导致手机停用.今天和大家分享三种解锁手机的方法,也和大家分享一下如何手机连接电脑没有反应又该如何解决. 方法一: ...
- android 4.4 art模式,安卓4.4的ART模式怎么打开 安卓4.4开启art模式方法图解
ART模式是Android系统新增的一个新的底层运行模式,目前仅有Android 4.4系统才拥有ART模式,与传统的安卓Dalvik模式有很大的区别.通过在ART模式运行程序应用,可以达到省电.节约 ...
- 【循序渐进学Python】面向对象知多少——魔方方法
[循序渐进学Python]面向对象知多少--魔方方法 据说,Python 的对象天生拥有一些神奇的方法,它们总被双下划线所包围,他们是面向对象的 Python 的一切. 他们是可以给你的类增加魔力的特 ...
最新文章
- 苹果公司提出Mobile-ViT | 更小更轻精度更高,MobileNets或成为历史
- python爬取学校题库_如何使用 Python 爬虫爬取牛客网 Java 题库?
- 使用jsonp及jquery的$.ajax解决跨域问题
- webview部分安卓机中文乱码
- [kuangbin带你飞]专题十二 基础DP1 C - Monkey and Banana HDU - 1069
- 数据迁移期间进程命令
- HDU1262 寻找素数对【素数】
- 一招判断三元催化堵塞_三元催化堵塞,许多老司机不知道如何处理,教你一妙招,油耗低...
- MAC下eclipse大小写切换问题 最方便最快捷的大小写切换 +常用的一些快捷键
- CCS错误解决:#10247-D null: creating output section “ramfuncs“ without a SECTIONS specification
- 超级大富翁主题团建活动
- Android好用的桌面小工具,Android桌面小工具Widget功能实现
- C语言字母排序不分大小写,求助C语言字母不分大小写排序
- 响应式原理(Vue2.x)下篇
- IDEA 自定义代码模板
- STM32和51最小系统原理图以及PCB板图以及元件库
- XTDorne平台搭建无人机仿真环境时遇到的问题及解决
- Sketch Nyquist plot 徒手绘制Nyquist 曲线
- 光电探测器的噪声等效功率,NEP
- [原创]隐身斗篷简介及仿真
热门文章
- fdfs往服务器上传文件超时,FastDFS 实现大文件分片上传
- python3 def download_python3下载抖音视频
- candence的图纸大小设置_提前感受一下,CAD高手的字体和标注设置原则
- 电商设计师必备素材|快速组合自己想要的场景和落版文字
- java 网络实验_20145220 实验五 Java网络编程
- vue 引入qunee_Vue页面中js引入的问题
- 错过就找不到了 Java API文档 免费下载!!!
- Python--上下文管理器学习(11.3)
- CPL,RPL和DPL的关系
- Linux负载均衡Linux Virtual Server (lvs) 内核自带的负载均衡器