【微服务】04-Polly实现失败重试和限流熔断

这篇具有很好参考价值的文章主要介绍了【微服务】04-Polly实现失败重试和限流熔断。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. Polly实现失败重试

1.1 Polly组件包

  • Polly
  • Polly.Extensions.Http
  • Microsoft.Extensions.Http.Polly

1.2 Polly的能力

  • 失败重试
  • 服务熔断 ⇒ 部分服务不可用时,可以快速响应熔断,避免持续请求不可用服务而导致整个应用程序宕掉
  • 超时处理 ⇒ 请求响应超过设置的时间,可按照预定的操作进行处理
  • 舱壁隔离 ⇒ 为服务定义最大流量和队列,避免服务应请求量过大而被压崩
  • 缓存策略 ⇒ 类似AOP为应用嵌入缓存机制,当缓存命中时可以快速响应缓存
  • 失败降级 ⇒ 当服务不可用时可以响应一个更友好的结果而非报错
  • 组合策略 ⇒ 将上面的策略组合在一起

1.3 Polly使用步骤

  • 定义要处理的异常类型或返回值
  • 定义要处理动作(重试、熔断、降级响应等)
  • 使用定义的策略来执行代码

1.4 适合失败重试的场景

  • 服务“失败”是暂时的,可自愈的
  • 服务是幂等的,重复调用不会有副作用

场景举例

  • 网络闪断
  • 部分服务节点异常

1.5 最佳实践

  • 设置失败重试次数
  • 设置带有步长策略的失败等待间隔 ⇒ 防止持续不断的重试,出现类似DDOS的情况
  • 设置降级响应 ⇒ 重试达到上限时,需要为服务设置降级响应
  • 设置断路器
 public void ConfigureServices(IServiceCollection services)
 {
 	// HttpClientFactory Polly内置的重试策略
	services.AddGrpcClient<OrderGrpc.OrderGrpcClient>(options =>
   {
       options.Address = new Uri("https://localhost:5001");
   })
   .ConfigurePrimaryHttpMessageHandler(provider =>
   {
       var handler = new SocketsHttpHandler();
       handler.SslOptions.RemoteCertificateValidationCallback = (a, b, c, d) => true; //允许无效、或自签名证书
       return handler;
   }).AddTransientHttpErrorPolicy(p => p.WaitAndRetryForeverAsync(i => TimeSpan.FromSeconds(i * 3)));// 设置响应500或408时重试,不指定次数直到成功

	// 定义个性化策略
	var reg = services.AddPolicyRegistry();
	
	reg.Add("retryforever", Policy.HandleResult<HttpResponseMessage>(message =>
	{
	    return message.StatusCode == System.Net.HttpStatusCode.Created;
	}).RetryForeverAsync());
	
	// 应用策略
	services.AddHttpClient("orderclient").AddPolicyHandlerFromRegistry("retryforever");
	services.AddHttpClient("orderclientv2").AddPolicyHandlerFromRegistry((registry, message) =>
    {
         return message.Method == HttpMethod.Get ? registry.Get<IAsyncPolicy<HttpResponseMessage>>("retryforever") : Policy.NoOpAsync<HttpResponseMessage>();
     });
 }

2.Polly实现熔断限流避免雪崩效应

2.1 策略类型

  • 被动策略(异常处理,结果处理)
  • 主动策略(超时处理,断路器,舱壁隔离,缓存)

被动策略:当服务响应出现一些异常或结果时进行处理
主动策略:根据策略实例去判断是否超时或异常等情况,这是由策略进行主动触发的一些操作

2.2 组合策略

  • 降级响应
  • 失败重试
  • 断路器
  • 舱壁隔离
    【微服务】04-Polly实现失败重试和限流熔断,微服务,NetCore,微服务,.netcore,后端,开发语言

限流、熔断策略都是有状态的,这指的是在策略中设置的并发数,队列数,还有熔断的采样时间和吞吐量,错误数这些计数器的状态,这些是由一个策略的实例去承载。在对不同服务进行不同的策略定义,单独计算它的熔断限流数值时,就需要单独定义不同的策略的实例,去完成不同服务之间的定义的隔离

// startup
public void ConfigureServices(IServiceCollection services)
{
	// 熔断策略
	services.AddHttpClient("orderclientv3").AddPolicyHandler(Policy<HttpResponseMessage>.Handle<HttpRequestException>().CircuitBreakerAsync(
                handledEventsAllowedBeforeBreaking: 10,// 报错10次后熔断服务
                durationOfBreak: TimeSpan.FromSeconds(10), // 熔断时间
                onBreak: (r, t) => { }, // 发生熔断后触发事件
                onReset: () => { }, // 熔断恢复后触发事件
                onHalfOpen: () => { }// 当熔断恢复之前进行验证服务是否可用的请求
                ));
}

//更高级设置
services.AddHttpClient("orderclientv3").AddPolicyHandler(Policy<HttpResponseMessage>.Handle<HttpRequestException>().AdvancedCircuitBreakerAsync(
				// 请求失败比例占80%时熔断
                failureThreshold: 0.8,
                
                // 计算请求失败比例的时间范围,当前为10秒内80%请求失败
                samplingDuration: TimeSpan.FromSeconds(10),
                
                // 最小吞吐量,在达到100个请求的时候再去计算上去失败比例,用于请求量小的时候不进行熔断
                minimumThroughput: 100,
                durationOfBreak: TimeSpan.FromSeconds(20),// 熔断时长
                onBreak: (r, t) => { }, // 发生熔断后触发事件
                onReset: () => { },// 熔断恢复后触发事件
                onHalfOpen: () => { }));// 当熔断恢复之前进行验证服务是否可用的请求

// 服务降级
var message = new HttpResponseMessage()
{
    Content = new StringContent("{}")
};
var fallback = Policy<HttpResponseMessage>.Handle<BrokenCircuitException>().FallbackAsync(message);

// 重试机制,重试3次,每次等1秒钟
var retry = Policy<HttpResponseMessage>.Handle<Exception>().WaitAndRetryAsync(3, i => TimeSpan.FromSeconds(1));

// 组合策略
//执行顺序breakPolicy -> retry -> fallback
var fallbackBreak = Policy.WrapAsync(fallback, retry, breakPolicy);
services.AddHttpClient("httpv3").AddPolicyHandler(fallbackBreak);

// 限流
var bulk = Policy.BulkheadAsync<HttpResponseMessage>(
	// 最大请求数
	maxParallelization: 30, 
	
	// 最大队列数,指的是达到最大请求数后又多少个请求可以被放到队列中;
	// 若不设置这个值,达到最大请求数后程序会抛出异常,如果队列数超出最大队列数,也会抛出异常
    maxQueuingActions: 20, 
    // 请求被限流时执行的处理方式
    onBulkheadRejectedAsync: contxt => Task.CompletedTask
   );

// 限流出现异常时,响应降级
var message2 = new HttpResponseMessage()
{
   Content = new StringContent("{}")
};
var fallback2 = Policy<HttpResponseMessage>.Handle<BulkheadRejectedException>().FallbackAsync(message);
// 组合策略
var fallbackbulk = Policy.WrapAsync(fallback2, bulk);
services.AddHttpClient("httpv4").AddPolicyHandler(fallbackbulk);


当服务发生熔断时,策略会抛出CircuitBreakerException异常,也就是熔断异常文章来源地址https://www.toymoban.com/news/detail-675985.html

到了这里,关于【微服务】04-Polly实现失败重试和限流熔断的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 封装axios请求重试和路由切换时请求取消

    请求重试函数:这里注意两个变量__retryCount 和retry分别代表当前次数和重试次数。如果请求中没有配置retry则正常进行不会进行重试。 请求取消我这里的场景是路由切换时,将上次路由全部取消也可以配置部分取消。注意变量noCancel,他来控制那些不需要被取消。 回顾axios请

    2024年02月21日
    浏览(31)
  • RocketMQ教程-(5)-功能特性-消息发送重试和流控机制

    本文为您介绍 Apache RocketMQ 的消息发送重试机制和消息流控机制。 消息发送重试 Apache RocketM Q的消息发送重试机制主要为您解答如下问题: 部分节点异常是否影响消息发送? 请求重试是否会阻塞业务调用? 请求重试会带来什么不足? 消息流控 Apache RocketMQ 的流控机制主要为

    2024年02月15日
    浏览(26)
  • 1 vue防抖和限流

    防抖(Debouncing)是一种前端开发中常用的技术,用于限制函数的执行频率。在防抖的机制下,一个函数在一定时间内只会执行一次,即使它被频繁地调用。 具体来说,防抖的实现方式是设置一个定时器,在每次函数被调用时,先清除之前的定时器,然后重新设置一个新的定

    2024年01月19日
    浏览(25)
  • 浅谈RabbitMQ消费端ACK和限流

    消费者 ACK 和 消费端限流 ack指  Acknowledge ,确认。 表示消费端收到消息后的确认方式。 有三种确认方式: • 自动确认:acknowledge=\\\" none \\\" • 手动确认:acknowledge=\\\" manual \\\" • 根据异常情况确认:acknowledge=\\\" auto \\\",(这种方式使用麻烦,不作讲解) 其中自动确认是指,当消息一

    2024年02月19日
    浏览(21)
  • 服务高可用保障:服务限流,Nginx实现服务限流

    一、前言 1.1什么是限流? 限流存在于高可用服务中。 用于高可用的保护手段,主要包括:缓存,降级,限流 限流:只允许指定的事件进入系统,超过的部分将被拒绝服务,排队或者降级处理。 1.2为什么需要限流? 一:服务扛不住压力了 二:因为资源的稀缺或者处于安全防

    2024年02月08日
    浏览(26)
  • RabbitMQ的消费者处理消息失败后可以重试,重试4次仍然失败发送到死信队列。

    生产者发送消息时采用雪花算法给消息设置唯一的消息id,消费者接收消息处理失败时,根据消息的唯一id统计失败次数,若没有达到失败次数限制,则让消息重回队列(在开启手动签收的前提),此时队列会再次给消费者发送消息;若达到失败次数限制,则让消息不重回队列,

    2024年02月07日
    浏览(32)
  • kafka消费失败重试机制

    1.kafka批量消费消息,使用containerFactory 监听消费失败消息  2.使用RetryingBatchErrorHandler 指定批量消费时失败消息的重试次数和时间,如果不是批量消费,则使用RetryingErrorHandler来指定重试次数和间隔时间

    2024年02月11日
    浏览(23)
  • 服务限流实现方案

    服务限流怎么做 限流算法 计数器 每个单位时间能通过的请求数固定,超过阈值直接拒绝。 通过维护一个单位时间内的计数器,每次请求计数器加1,当单位时间内计数器累加到大于设定的阈值,则之后的请求都被绝,直到单位时间已经过去,再将计数器重置为零。但可能会

    2024年01月23日
    浏览(24)
  • 手写服务限流6种实现方式

    ImportNew  2023-05-29 11:31   发表于上海 以下文章来源于码农参上 ,作者Dr Hydra 码农参上. 专注后端技术分享,有趣、深入、直接,与你聊聊技术。 今天来和大家聊聊服务的限流。 服务限流,是指通过控制请求的速率或次数来达到保护服务的目的,在微服务中,我们通常会将它

    2024年02月07日
    浏览(22)
  • ubuntu22.04 服务器 SSH 密钥登录失败

    SSH密钥登录,是将SSH公钥写入服务端的 ~/.ssh/authorized_keys 文件中。 今天装了ubuntu22.04的系统,按照以往操作,在服务端配置了SSH公钥之后,发现竟然无法登录。 首先查看OpenSSH版本: 查看 /var/log/auth.log 文件,发现有如下错误信息: 通过错误信息来看,填入 authorized_keys 文件的

    2024年01月18日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包