您好、欢迎来到现金彩票网!
当前位置:秒速快3 > 瞬时故障 >

HttpClientFactory系列二:集成Polly处理瞬态故障

发布时间:2019-08-25 12:15 来源:未知 编辑:admin

  前言:最近,同事在工作中遇到了使用HttpClient,有些请求超时的问题,辅导员让我下去调研一下,HttpClinet的使用方式已经改成了之前博客中提到的方式,问题的原因我已经找到了,就是因为使用了伪异步,导致阻塞主线程。在之前的博客中有园友,建议在使用静态的HttpClinet时务必使用它的Async方法,所以就得从头到尾异步化。这一点在之前的文章中没有提,这里作为补充,也感谢这位园友。关于怎么使用异步编程,在这里我就不聊了,大家可以看看其他的博客,看完公司的代码之后,我想强调的是,在使用异步编程的时候,关于返回值的问题:

  为什么async方法返回的通常都是Task或者TaskT,而不是T本身?这是因为,Task和TaskT代表着在将来某一个时刻将会返回T类型的结果。因此,在主线程调用HttpPostWhitStrBody时,实际上你拿到的是一个未来才会发生的预期,也就是未来的某一个时间会得到一个string的结果。如果返回的是一个T本身,那么,在主线程调用时就会因为访问这个需要一段时间才能给出结果,从而阻塞了主线程。因此,如果async方法有返回值,应返回TaskT。如果没有返回值,应该返回Task。大家如果不太明白的话,建议多了解一下C#中的异步编程。好了,前戏太多了,下面就来聊聊如何集成Polly。

  在聊如何集成Polly前,我们先来看看在异步编程中如何处理异常。当异步操作发生异常的时候,异常会停留在异步方法中,调用方法无法直接看到,因此,我们应该异步方法中处理异常,而不是在调用方法中处理异常。如果我们使用了await修饰了任务,那么,只需要为它包上一层try-catch就可以了。当然了,也可以在调用方法(比如Main方法中)捕捉异常,这就需要异常从异步方法中传播给调用方法。做到这件事是很容易的,只需要两个条件:

  (1)调用方法本身也是async的,并且,在内部调用异步方法,并使用await。

  因为C#不允许在Main方法中使用async(在C#7.1中,可以使用async修饰Main方法了),因此,我们不得不再创建一层方法,下面通过代码演示一下。

  一般在处理异常的时候,我们都是采用 try-catch来做处理的,若我们想重试三次,此时我们只能进行循环三次操作。我们只能简单进行处理,自从有了Polly,什么重试机制,超时都不在话下,下面把话题转向Polly。

  在聊下面的话题时,建议大家先认真阅读一下这篇博客,因为博主讲的非常细致:Polly

  Polly是一种流行的瞬态故障处理库,它提供了一种机制来定义可在某些故障发生时应用的策略。 最常用的策略之一就是重试策略。 这中策略允许您包装一些代码,如果发生故障,将重试这些代码; 必要时也可以重试多次。 这在您的应用程序需要与外部服务通信的情况下非常有用。 当通过HTTP与服务进行通信时,会出现瞬态故障,这种风险始终存在。 瞬态故障可能会阻碍您的请求完成,但是瞬态故障也可能是暂时性的问题。因此, 这使得在这些情况下重试成为明智的选择。

  除了重试之外,Polly还提供了许多其他类型的策略,其中许多策略可能需要与重试相结合,以构建处理故障的复杂方法。 我将在本文中介绍一些更一般的例子,但是如果你想要更全面的了解,我建议你查看一下Polly wiki。

  我们可以用这个扩展在我们的ConfigureServices 方法中,代码如下:

  在这个例子中,我们定义了一个名字为“github”的客户端,并且我们使用AddPolicyHandler 方法来添加了一种处理超时的策略,这里提供的超时策略,必须是IAsyncPolicyHttpResponseMessage,这个中策略在任何请求超过10s都会触发。

  如果可能的话,当我们在使用Polly时,最好的尝试是,定义一次策略并在应用相同策略的情况下共享它们,这样要更改策略,只需在一个位置进行更改。此外,它还确保仅分配策略一次。当然了,如果多个使用者希望通过相同的断路器实例运行,则需要共享诸如断路器之类的策略。不太理解,不要紧,下面看代码,体会一下。

  处理HTTP请求时,我们要处理的最常的问题就是瞬态故障。 由于这是一个常见的要求,Microsoft.Extensions.Http.Polly软件包中包含一个特定的扩展,我们可以使用它来快速设置处理瞬时故障的策略。

  例如,要在指定客户端的请求发生瞬时故障时添加基本重试,我们可以按如下方式注册重试策略:

  我们需要意识到, 在进行重试时,我们需要考虑幂等性。 重试HTTP GET是一种非常安全的操作。因为HTTP GET本身就是幂等性的, 如果我们调用一个方法但没有收到任何响应,我们可以安全地重试调用而不会有任何危险。 但是,请考虑如果我们重试HTTP POST请求会发生什么? 在这种情况下,我们必须更加小心,因为您的原始请求可能实际收到,但我们收到的响应却显示失败。 在这种情况下,重试可能导致数据重复或下游系统中存储的数据损坏。 在这里,您需要更多地了解下游服务在多次收到相同请求时将执行的操作。 重试是一种安全操作? 当您拥有下游服务时,更容易控制它。 例如,您可以使用一些唯一标识符来防止重复的POST。

  如果您对下游系统的控制较少,或者您知道重复的POST可能会产生负面影响,则需要更仔细地控制策略。 可能适合的做法是定义不同的命名/类型客户端。 您可以为那些没有副作用的请求创建一个,而为那些有副作用的请求创建另一个。 然后,您可以使用正确的客户端进行操作。 但是,这可能会变得有点难以管理。 更好的选择是使用AddPolicyHandler的重载,它允许我们访问HttpRequestMessage,以便可以有条件地应用策略。 那个重载看起来像这样:AddPolicyHandler(FuncHttpRequestMessage, IAsyncPolicyHttpResponseMessage policySelector),您将注意到此处的policySelector委托可以访问HttpRequestMessage,并且应该返回IAsyncPolicy HttpResponseMessage。 我们无法访问PolicyBuilder设置来处理瞬态错误,就像我们在前面的示例中所做的那样。 如果我们想要处理常见的瞬态错误,我们需要为我们的策略定义预期条件。 为了简化这一过程,Polly项目包含一个帮助扩展,我们可以使用它来设置一个准备好处理常见瞬态错误的PolicyBuilder。 要使用扩展方法,我们需要从Nuget添加Polly.Extensions.Http包。

  我想在本文中介绍的最后一个示例是如何从策略注册表中应用策略。 为了支持策略重用,Polly提供了PolicyRegistry的概念,PolicyRegistry本质上是策略的容器。 这些可以在应用程序启动时通过向注册表添加策略来定义。 然后可以传递注册表并用于按名称访问策略。IHttpClientBuilder上可用的扩展还支持使用注册表将基于Polly的处理程序添加到客户端。

  在此示例中,我们添加了两个超时策略并为其指定了名称。 现在,在注册客户端时,我们可以调用IHttpClientBuilder上的AddPolicyHandlerFromRegistry方法。 这将采用我们想要使用的策略的名称。 当工厂创建此命名客户端的实例时,它将添加适当的处理程序,在“regular”重试策略中包含调用,该策略将从注册表中检索。

  通过这些库,您可以轻松地启动并运行能够无缝处理瞬态故障的HttpClient实例。 有关更详细的Polly文档和示例,建议您查看Polly wiki。这里只是聊了关于HttpClientFactory中集成Polly的基础用法,关于更详细的使用请参考:,好了今天就聊到这里,该系列文章还有最后一篇,对于Polly我也是刚接触,至于项目中是否使用还要经过辅导员的审核,希望对你有帮助,谢谢。

  译者:王亮作者:Polly团队原文:声明:我翻译技术文章不是逐句翻译的,而是根据我自己的理解来表述的(包括标题)。其中可能会去除一些不影响理解但本人实在不知道如何...博文来自:的博客

  前言上一篇说了一下用HttpClientFactory实现了简单的熔断降级。这篇就来简单说说用HttpClientFactory来实现服务发现。由于标题已经好明显的说了S......博文来自:dotNET跨平台

  译者:王亮 作者:Polly团队 原文:译者序一:前两天写了一篇文章 .NETCore开源项目Polly介绍,在写这篇文章查看Polly资料时,看到了“Polly...博文来自:ahilll的博客

  前言:最近,同事在工作中遇到了使用HttpClient,有些请求超时的问题,辅导员让我下去调研一下,HttpClinet的使用方式已经改成了之前博客中提到的方式,问题的原因我已经找到了,就是因为使...博文来自:weixin_30402343的博客

  简介Polly是一种.NET弹性和瞬态故障处理库,允许我们以非常顺畅和线程安全的方式来执诸如行重试,断路,超时,故障恢复等策略。Polly针对对.NET4.0,.NET4.5和.NETStandard...博文来自:wucong60的专栏

  前言本节我们来介绍一款强大的库Polly,Polly是一种.NET弹性和瞬态故障处理库,允许我们以非常顺畅和线程安全的方式来执诸如行重试,断路,超时,故障恢复等策略。Polly针对对.NET4.0,....博文来自:dotNET跨平台

  引言:ASP.NETCore2.1中出现了一个新的HttpClientFactory功能,它有助于解决开发人员在使用HttpClient实例从其应用程序中访问外部web资源时可能遇到的一些常见问题...博文来自:ahilll的博客

  在使用微服务的过程中经常会遇到这样的情况,就目前我遇到的问题做下分析情况一:这里服务对于前后端分离情况来说,多使用查询服务,前端直接获取不同服务的数据展示,如果出现其中的......博文来自:dotNET跨平台

  先说个抱歉,原来准备自己写个例子,从头到尾介绍集成呢,但是最近工作太忙,没有时间从头到尾一起做,就把原来整理的演示示例的开发过程稍微整理下给大家用作参考。 本篇文正主要介绍演示示例中表单的集成,采用的...博文来自:yangchenhui_ok的博客

  实际工作中,如果单个服务的配置未免太过麻烦,dubbo支持扫描注解的形式发布服务。Provider方在配置文件中加上,是dubbo的扫描标签,它除了会扫描带有@Component、@Servic...博文来自:逝兮诚

  一.简介上篇博主已经给大家分享了Qualcomm平台DSP算法集成的架构和算法原理及其实现的功能,今天我们进一步分享Qualcomm通用平台系列的算法集成的实际案例。图1DSP简介二.算法集成案例1....博文来自:ad3600的博客

  Redis讲解系列之与Spring集成(二)上章中我们讲解了如何使用spring与spring-data-redis如何整合在一起同时总结出了一些优缺点,正对于缺点的优化和改善,本章将讲解一种高自定获...博文来自:Dusty丶one的博客

  1、新建springboot脚手架工程,pom文件如下,其中引入了kafka需要的依赖,注意这里的kafka版本号需要和之前安装的kafka版本一致,要不然会有问题lt;?xmlvers...博文来自:yfz792178428的专栏

  软件上线后,发生线上故障很常见,但是如何应对线上的故障,这能反映出新手和高手的差距,也能反映出运维水平的高低。新手遇到复杂的线上故障,不知道该怎么下手。对于线上故障,简单的比如从界面或者错误日志就可以...博文来自:

  应一个同事的要求,我将一张表的时间字段由datetime型改为smalldatetime型,这种表里的数据很多,前2天看的时候已经有140万条数据了,我使用的是企业服务器在已有表格上选定‘设计’进行修改的,系统提示可能要花的时间很长,进行了2个小时的时候,有人重起了机器,这下就麻烦了,数据库就不正常了,干什么都不行,我原想通过分离、附加的方式看看能不能行,但是附加不上去,其他的现象是数据库数据有30G,日志文件居然有15G,而在原来日志只有200多M,有谁有办法解决这个问题没???!!!!!

  Oracle_ORA-12518故障_处理,希望在此与大家分享,能够在实际的工作中提高解决问题的能力

  局域网障碍判断与处理 客户现状: 单位用户、两层楼、大约10个信息点 使用电信2M光纤专线组成内网。 使用一台cisco路由器、一台8换机 客户反映存在的问题: 大部分计算机不能正常上网但是有两台电脑可以正常使用

  熔断降级是一个非常重要的概念,我们先说一下什么是熔断降级,咱们都知道服务发现,一个有问题的服务器没来得急注销过一会就崩溃掉了,那么我们的请求就有可能访问一个已经崩溃的服务器,那么就会请求失败,因为已经...博文来自:

  CXF支持所有的自定义的对象以及常见的诸如List对象,可是对于MapCXF不支持,比如现在服务端根据客户端传递过来一个用户名返回一个MAP形式的权限集合,一发布就会报错,这是需要将map用适配器转换...博文来自:

  Ocelot是一个使用.NETCore平台上的一个APIGateway,最近我在参与这个项目的开发,开发完成第一个被项目作者认同功能就是使用Polly处理部分失败问题。...博文来自:

  华佳慧科技为您介绍华为OSN1500B故障应急处理:检查华为OSN1500B保护倒换:保护倒换故障包括网络级保护倒换(如通道保护、SNCP保护或复用段保护等)故障和设备级保护倒换(如交叉、时钟主备...博文来自:

  有一台预上线的服务器最近在做压力测试,也引发了一系列的相关问题,排查思路可以提供参考。问题的起因就是收到同事提醒,根据监控报警提示,磁盘空间满了。上面有一个MySQL服务,现在已经写入不了数据了。cr...博文来自:

  master节点的故障发现 对于master节点故障的检测,采用“心跳线”的方式进行,它的布局如图1-1所示。当masterA在处理客户端的请求时,masterB处于监控masterA的状态。 mas...博文来自:

  首先要初始化计算,然后定义contour图,然后在solutionanimation中设置相关图像以及设置存储类型。然后点击计算开始计算,计算完毕后在animation中找到playback,选择相关...博文来自:

  项目架构:squid+apache+resin+ibatis+oracle项目已经上线年多,最近半年总是报连接池满故障,resin连接池数居高不下,大都是空闲连接到数据库端,最近更新代码很少,而日志...博文来自:

  问题描述:journalnode节点的editlog日志目录被其它应用日志占满;导致activenn无法向journalnode写入editlog,导致集群宕机;解决思路:HA的工作流程:集群启动后一...博文来自:

http://ellisramseydds.com/shunshiguzhang/318.html
锟斤拷锟斤拷锟斤拷QQ微锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷微锟斤拷
关于我们|联系我们|版权声明|网站地图|
Copyright © 2002-2019 现金彩票 版权所有