目录

背景

重试模式

实现

使用代码

兴趣点


  • 下载源代码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

面向对象的重试模式方法相关推荐

  1. 异步重试_异步重试模式

    异步重试 当您有一段经常失败且必须重试的代码时,此Java 7/8库提供了丰富且简洁的API以及针对此问题的快速且可扩展的解决方案: ScheduledExecutorService schedule ...

  2. android电视工程模式,智能电视如何打开ADB?进入工程模式方法

    原标题:智能电视如何打开ADB?进入工程模式方法 ADB调试是智能安卓设备特有的功能之一,一般情况下智能电视ADB调试是默认隐藏关闭的.ADB模式可以使电视与外界设备进行数据传送.例如我们通过远程推送 ...

  3. PHP面向对象处理请求,PHP面向对象之命令模式

    PHP面向对象之命令模式,这个模式主要由 命令类.用户请求数据类.业务逻辑类.命令类工厂类及调用类构成,各个类的作用概括如下: 1.命令类:调用用户请求数据类和业务逻辑类: 2.用户请求数据类:获取用 ...

  4. 【软件项目管理】用例分析方法采用一种面向对象的情景分析方法

    用例分析方法采用一种面向对象的情景分析方法. 传统的结构化分析方法是面向功能的,而面向对象的视点是将系统看作一组服务,将问题看作相互作用的实体.用例分析方法采用面向对象的方法,将现实世界的" ...

  5. 明日之后 找不到服务器,明日之后登录服务器错误怎么办 登录服务器错误请重试解决方法...

    明日之后官方版v1.0安卓版 类型:角色扮演大小:0KB语言:中文 评分:6.6 标签: 立即下载 明日之后今天开启安卓测试,玩家下载游戏就能玩啦,不过很多玩家在进入游戏界面显示登录服务器错误请重试, ...

  6. 如何禁用C-State功能?关闭intel CPU的C-State省电模式方法

    前段时间,Win10电脑经常出现蓝屏故障,蓝屏代码为WHEA_UNCORRECTABLE_ERROR,一开始以为是系统的问题,重新安装系统几次都未能解决这个问题,多次更新驱动也得不到解决,包括内存也更 ...

  7. iPhone解锁的三种方法【附全型号进入恢复模式方法】

    iPhone忘记了屏幕密码锁,导致我们无法解锁使用手机,当我们输入了错误密码次数过多还会导致手机停用.今天和大家分享三种解锁手机的方法,也和大家分享一下如何手机连接电脑没有反应又该如何解决. 方法一: ...

  8. android 4.4 art模式,安卓4.4的ART模式怎么打开 安卓4.4开启art模式方法图解

    ART模式是Android系统新增的一个新的底层运行模式,目前仅有Android 4.4系统才拥有ART模式,与传统的安卓Dalvik模式有很大的区别.通过在ART模式运行程序应用,可以达到省电.节约 ...

  9. 【循序渐进学Python】面向对象知多少——魔方方法

    [循序渐进学Python]面向对象知多少--魔方方法 据说,Python 的对象天生拥有一些神奇的方法,它们总被双下划线所包围,他们是面向对象的 Python 的一切. 他们是可以给你的类增加魔力的特 ...

最新文章

  1. 苹果公司提出Mobile-ViT | 更小更轻精度更高,MobileNets或成为历史
  2. python爬取学校题库_如何使用 Python 爬虫爬取牛客网 Java 题库?
  3. 使用jsonp及jquery的$.ajax解决跨域问题
  4. webview部分安卓机中文乱码
  5. [kuangbin带你飞]专题十二 基础DP1 C - Monkey and Banana HDU - 1069
  6. 数据迁移期间进程命令
  7. HDU1262 寻找素数对【素数】
  8. 一招判断三元催化堵塞_三元催化堵塞,许多老司机不知道如何处理,教你一妙招,油耗低...
  9. MAC下eclipse大小写切换问题 最方便最快捷的大小写切换 +常用的一些快捷键
  10. CCS错误解决:#10247-D null: creating output section “ramfuncs“ without a SECTIONS specification
  11. 超级大富翁主题团建活动
  12. Android好用的桌面小工具,Android桌面小工具Widget功能实现
  13. C语言字母排序不分大小写,求助C语言字母不分大小写排序
  14. 响应式原理(Vue2.x)下篇
  15. IDEA 自定义代码模板
  16. STM32和51最小系统原理图以及PCB板图以及元件库
  17. XTDorne平台搭建无人机仿真环境时遇到的问题及解决
  18. Sketch Nyquist plot 徒手绘制Nyquist 曲线
  19. 光电探测器的噪声等效功率,NEP
  20. [原创]隐身斗篷简介及仿真

热门文章

  1. fdfs往服务器上传文件超时,FastDFS 实现大文件分片上传
  2. python3 def download_python3下载抖音视频
  3. candence的图纸大小设置_提前感受一下,CAD高手的字体和标注设置原则
  4. 电商设计师必备素材|快速组合自己想要的场景和落版文字
  5. java 网络实验_20145220 实验五 Java网络编程
  6. vue 引入qunee_Vue页面中js引入的问题
  7. 错过就找不到了 Java API文档 免费下载!!!
  8. Python--上下文管理器学习(11.3)
  9. CPL,RPL和DPL的关系
  10. Linux负载均衡Linux Virtual Server (lvs) 内核自带的负载均衡器