云原生系统之弹性模式

大纲

1.云原生系统的弹性模式resiliency pattern    1.1 服务故障的雪崩效应    1.2 回应之前云原生--弹性请求的疑问?

2. 弹性模式:作用在下游请求消息上3. 短期中断的响应码4. Polly经典策略5.   Golang 断路器模式
德国哲学家尼采说过:那些杀不死我的东西,只会让我更加强大


hi,好久不见,马甲哥之前意译并连载了《Microsoft Cloud-native toc.pdf》部分内容

•什么是云原生•现代云原生设计理念•.NET微服务•谈到云原生,绕不开容器化•支撑性服务 & 自动化能力

01

云原生系统的弹性模式

结合最近的工作经验,本次继续聊一聊云原生的弹性模式 (resilience not scale), 这也是回应《现代云原生设计理念》中

“在分布式体系结构中,当服务B不响应来自服务A的网络请求会发生什么?
当服务C暂时不可用,其他调用C的服务被阻塞时该怎么办?”

由于网络原因或自身原因,B、C服务不能及时响应,服务A发起的请求将被阻塞(直到B、C响应),此时若大量请求涌入,服务A的线程资源将被消耗殆尽,服务A的处理性能受到极大影响,进而影响下游依赖的external clients/backend srv。

故障会传播,造成连锁反应,对整个分布式结构造成灾难性后果,这就是服务故障的“雪崩效应”。

当B、C服务不可用,下游客户端/backend srv能做什么?
客观上请求不通,执行预定的弹性策略:重试/断路?

02

弹性模式:作用在下游的请求消息上

弹性模式是系统面对故障仍然保持工作状态的能力,它不是为了避免故障,而是接受故障并尝试去面对它。

Polly是一个全面的.NET弹性和瞬时错误处理库,允许开发者以流畅和线程安全的方式表达弹性策略。

策略场景行为
Retry抖动/瞬时错误,短时间内自动恢复在特定操作上配置重试行为
Circuit Breaker在短期内不大可能恢复当故障超过阈值,在一段时间内快速失败
Timeout
限制调用者等待响应的时间
Bulkhead
将操作限制在固定的资源池,防止故障传播
Cache
自动存储响应
Bulkhead
一旦失败,定义结构化的行为

一般将弹性策略作用到各种请求消息上(外部客户端请求或后端服务请求)

其目的是补偿暂时不可用的服务请求。

03

 短期中断的响应码

Http Status code原因
404not found
408request timeout
429two many requests
502bad gateway
503service unavailable
504gateway timeout

正确规范的响应码能帮助开发者尽快确认故障。

执行故障策略时,也能有的放矢,比如只重试那些由失败引起的操作,对于403UnAuthorized不可重试。

Kubernetes探针踩坑记

04

 Polly的经典策略

•Retry:对网络抖动/瞬时错误可以执行retry策略(预期故障可以很快恢复),•Circuit Breaker:为避免无效重试导致的故障传播,在特定时间内如果失败次数到达阈值,断路器打开(在一定时间内快速失败);           同时启动一个timer,断路器进入半开模式(发出少量请求,请求成功则认为故障已经修复,进入关闭状态,重置失败计数器。)


services.AddHttpClient("small")//降级.AddPolicyHandler(Policy<HttpResponseMessage>.HandleInner<Exception>().FallbackAsync(new HttpResponseMessage(),async b =>{// 1、降级打印异常Console.WriteLine($"服务开始降级,上游异常消息:{b.Exception.Message}");// 2、降级后的数据b.Result.Content= new StringContent("请求太多,请稍后重试", Encoding.UTF8, "text/html");b.Result.StatusCode = HttpStatusCode.TooManyRequests;await Task.CompletedTask;}))//熔断                                                      .AddPolicyHandler(Policy<HttpResponseMessage>.Handle<Exception>() .CircuitBreakerAsync(3,    // 打开断路器之前失败的次数TimeSpan.FromSeconds(20), // 断路器的开启的时间间隔(ex, ts) =>  //熔断器开启{Console.WriteLine($"服务断路器开启,异常消息:{ex.Exception.Message}");Console.WriteLine($"服务断路器开启的时间:{ts.TotalSeconds}s");}, () => { Console.WriteLine($"服务断路器重置"); },   //断路器重置事件() => { Console.WriteLine($"服务断路器半开启(一会开,一会关)"); }  //断路器半开启事件))//重试.AddPolicyHandler(Policy<HttpResponseMessage>.Handle<Exception>().RetryAsync(3))// 超时 .AddPolicyHandler(Policy.TimeoutAsync<HttpResponseMessage>(TimeSpan.FromSeconds(2))); 

☹️当一个应用存在多个Http调用,按照上面的经典写法,代码中会混杂大量重复、与业务无关的口水代码,
思考如何优雅的对批量HttpClient做弹性策略。

这里提供两个实践:

① 博客园驰名博主edisonchou: 使用AOP框架,动态织入Polly

② CSDN某佚名大牛,使用反射加配置实现的PollyHttpClientServiceCollectionExtension扩展类, 支持在配置文件指定HttpClientName

05

 Golang的断路器

go get github.com/sony/gobreaker

func NewCircuitBreaker(st Settings) *CircuitBreaker 实例化断路器对象, 参数如下:

type Settings struct {Name          stringMaxRequests   uint32       #半开状态允许的最大请求数量,默认为0,允许1个请求Interval      time.DurationTimeout       time.Duration  # 断路器进入半开状态的间隔,默认60sReadyToTrip   func(counts Counts) bool   # 切换状态的逻辑OnStateChange func(name string, from State, to State)
}

下面这个示例演示了:请求谷歌网站,失败比例达到60%,就切换到"打开"状态,同时开启60sTimer,到60s进入“半开”状态(允许发起一个请求),如果成功, 断路器进入"关闭"状态;失败则重新进入“打开”状态,并重置60sTimer

package main
import ("fmt""io/ioutil""log""net/http""github.com/sony/gobreaker"
)
var cb *gobreaker.CircuitBreaker
func init() {var st gobreaker.Settingsst.Name = "HTTP GET"st.ReadyToTrip = func(counts gobreaker.Counts) bool {failureRatio := float64(counts.TotalFailures) / float64(counts.Requests)return counts.Requests >= 3 && failureRatio >= 0.6}cb = gobreaker.NewCircuitBreaker(st)
}
// Get wraps http.Get in CircuitBreaker.
func Get(url string) ([]byte, error) {body, err := cb.Execute(func() (interface{}, error) {resp, err := http.Get(url)if err != nil {return nil, err}defer resp.Body.Close()body, err := ioutil.ReadAll(resp.Body)if err != nil {return nil, err}return body, nil})if err != nil {return nil, err}return body.([]byte), nil
}
func main() {body, err := Get("http://www.google.com/robots.txt")if err != nil {log.Fatal(err)}fmt.Println(string(body))
}

总结

   本文记录了云原生系统的弹性模式:通过预设策略直面失败,补偿暂时不可用的请求、避免故障传播, 这对于实现微服务高可用、弹性容错相当重要。
•https://blog.csdn.net/weixin_44588495/article/details/106361934•https://blog.csdn.net/qq_26900081/article/details/108071374•https://www.cnblogs.com/edisonchou/p/9159644.html•https://docs.microsoft.com/en-us/dotnet/architecture/cloud-native/application-resiliency-patterns•https://docs.microsoft.com/en-us/azure/architecture/patterns/circuit-breaker

更多干货及最佳实践
关注并星标我们

后台回复cloud-native,获取微软云原生技术白皮书

今天因为你的点赞,让我元气满满!

 ✍️本文永久链接在这里!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/300618.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

js null加法的处理

首先看一段JS高级编程中&#xff0c;有关加法()操作符的解释&#xff1a;一个简单的测试&#xff1a;alert(3 null); // 3 alert(3 null); // 3null可见对于null的处理&#xff0c;并不是简单的取String。ecma262的定义如下&#xff1a;对第7、8步骤的理解&#xff1a;7. 如果…

符合WEB标准的div+css导航下拉菜单

<html xmlns"http://www.w3.org/1999/xhtml"lang"zh-CN"><head><meta http-equiv"Content-Type"content"text/html; charsetgb2312"/><title>52css.com - css菜单演示</title><style type"text…

深入DataGrid分页样式实例

DataGrid提供了分页功能&#xff0c;不过看上去功能有限&#xff0c;但是我们可以通过DataGrid的一些属性来获取状态以及增加首页、尾页功能按钮。这里没有使用DataGrid的自定义分页功能&#xff0c;如果在速度效率不是很讲究的情况下&#xff0c;由DataGrid自己管理分页还是不…

dotnet中的counter

打造一个完善的软件产品&#xff0c;准确完整实现业务是第一步&#xff0c;再有就是有优秀的性能&#xff0c;稳定的运行。为了能量化性能指标&#xff0c;需要利用工具&#xff0c;来收集这些数据&#xff0c;以便对产品作出代码级调整。先说一下.net中带一个全局工具&#xf…

与殿堂级大师隔空对话——一张纸是怎么限制了我们的想象力

▲ 点击查看七天假期&#xff0c;熊孩子在家捣乱的情况实在是太多啦&#xff0c;就一眨眼的功夫&#xff0c;满地的积木&#xff0c;到处都有&#xff0c;还有到处都是的纸张碎片&#xff0c;真真是十分的头疼&#xff01;在蚊子小时候&#xff0c;玩具远不如现在丰富&#x…

Redis学习手册(String数据类型)

2019独角兽企业重金招聘Python工程师标准>>> 一、概述&#xff1a; 字符串类型是Redis中最为基础的数据存储类型&#xff0c;它在Redis中是二进制安全的&#xff0c;这便意味着该类型可以接受任何格式的数据&#xff0c;如JPEG图像数据或Json对象描述信息等。…

DDD与批量操作

原文链接&#xff1a;https://enterprisecraftsmanship.com/posts/ddd-bulk-operations/将批量操作与领域驱动设计相结合是一个困难的问题。在这篇文章中&#xff0c;我们将看看为什么会这样&#xff0c;并讨论如何结合两个。本文也是对读者提问的回应。这个问题包含一个有趣的…

乔布斯死后的300亿遗产终于被败光了,没想到竟是干了这件事

全世界只有3.14 %的人关注了青少年数学之旅前段时间&#xff0c;果粉们翘首以待的科&#xff08;ping&#xff09;技&#xff08;guo&#xff09;界&#xff08;fa&#xff09;春&#xff08;bu&#xff09;晚&#xff08;hui&#xff09;又如期而至。每年一到新款 iPhone 发布…

博客群发(2)--实现登陆

模板方法 python也是一种面向对象的语言&#xff0c;所以在实现群发的时候&#xff0c;会登陆不同的网站&#xff0c;但是登陆的方法什么的不尽相同&#xff0c;所以这里想到的是模板方法。 模板方法模式&#xff1a; 应用特性&#xff1a;重复做相同逻辑的事情&#xff0c;但是…

flask取mysql数据很慢_[flask 优化] 由flask-bootstrap,flask-moment引起的访问速度慢的原因及解决办法...

一周时间快速阅读了400页的《javascript基础教程》&#xff0c;理解了主要概念。解决了一个很久之前的疑问。我的网站是使用flask框架搭建的&#xff0c;介绍flask web的一本著名的书(之前提到过)作者搭建个人博客时&#xff0c;向读者推荐了flask-bootstrap,flask_moment这两个…

运维管理工具-- Deploy Assistant

Deploy Assistant 好用的运维管理工具&#xff0c;目前只支持了docker,后续会继续开发手机端&#xff0c;以及其他的功能&#xff0c;如k8s,mysql,redis等。系统采用ssh登录Linux系统&#xff0c;调用docker api的模式开发&#xff0c;支持账号密码&#xff0c;证书登录 支持do…

空调冷冻水系统控制

空调冷冻水系统控制 张红霞 摘要&#xff1a;通过某大厦空调冷冻水系统控制的介绍&#xff0c;表明只有在空调设计人员提供了准确的控制、测量 参数的基础下&#xff0c;才能实现冷水机组自动控制的目的&#xff0c;满足空调的设计要求。 Control of Refrigerating Water Syste…

用Python进行数据探索,探索竞赛优胜方案

全世界只有3.14 %的人关注了青少年数学之旅AI这个词相信大家都非常熟悉&#xff0c;近几年来人工智能圈子格外热闹&#xff0c;光是AlphoGo就让大家对它刮目相看。随着大数据时代信息科技的快速发展&#xff0c;各种各样的数据充斥着我们的生活。而我们又当如何有效利用数据&am…

微结构设计能力看国产CPU发展

当下&#xff0c;国内CPU公司可以大致分为泾渭分明的两条技术路线&#xff0c;分别是自主研发路线和技术引进路线&#xff0c;从实践上看&#xff0c;自主CPU架构改进能力和IPC提升能力要明显优于技术引进CPU&#xff0c;在研发上更具发展后劲。 FT CPU IPC进步相对有限2013年的…

看到这块Google的“墓地”,心中作何感想?| 今日最佳

世界只有3.14 % 的人关注了青少年数学之旅&#xff08;图源网络&#xff0c;侵权删&#xff09;

轻松实现突破网管限制(SoftEther实际应用)

因为公司限制办公室里的机器上网&#xff0c;只能使用一台内网的HTTP代理服务器浏览网站&#xff0c;而且还只能浏览端口为80的网站&#xff0c;想在天空软件站下个软件还只能通过四川的一个服务器下载。实在很郁闷。找了几天的代理工具。先后用过了“通通通”和“SocksOnline”…

看完这些,孩子的学习效率提高10倍

全世界只有3.14 % 的人关注了青少年数学之旅在工作之余&#xff0c;我们大量的碎片时间被手机占据。无意识的刷手机打发无聊&#xff0c;不如有趣又高品质的积累。我们特意精选了在不同领域的几个高品质公众号代表&#xff0c;希望让你在快乐打发闲暇时光的同时&#xff0c;也能…

中国唯一一位女性 Apache Member 潘娟:我们还是要走出自己与众不同的 My Way

The Apache Way 是一种参照&#xff0c;但我们还是要走出自己的与众不同的 My Way。———潘娟ApacheCon 是 Apache 软件基金会&#xff08;ASF&#xff09;的官方全球系列大会。作为久负盛名的开源盛宴&#xff0c;ApacheCon 在开源界备受关注&#xff0c;也是开源运动早期的知…

python seaborn 热图_python – 在seaborn中结合两张热图

在图中并排显示两个seaborn热图的一种可能方式是将它们绘制成单独的子图.可以将子图之间的空间设置为非常小(wspace 0.01),并将相应的颜色条和标记标记定位在该间隙之外.import matplotlib.pyplot as pltimport numpy as npimport pandas as pdimport seaborn as snsdf pd.Da…

Impala入门笔记

From:http://tech.uc.cn/?p817 问题背景&#xff1a; 初步了解Impala的应用重点测试Impala的查询速度是否真的如传说中的比Hive快3~30倍写作目的&#xff1a; 了解Impala的安装过程初步了解Impala的使用比较Impala与Hive的性能测试适合阅读对象&#xff1a; 想了解Impala安装的…