.NET Core微服务实践( 二 )


.NET Core微服务实践
文章图片
Polly是一个.NET弹性和瞬态故障处理库 , 允许开发人员以Fluent和线程安全的方式来实现重试、断路、超时、隔离和回退策略 。
首先这里的说的瞬态故障包含了程序发生的异常和出现不符合开发者预期的结果 。 所谓瞬态故障 , 就是说故障不是必然会发生的 , 而是偶然可能会发生的 , 比如网络偶尔会突然出现不稳定或无法访问这种故障 。 至于弹性 , 就是指应对故障Polly的处理策略具有多样性和灵活性 , 它的各种策略可以灵活地定义和组合 。
Polly的七种策略
重试(Retry):出现故障自动重试 。
熔断(Circuit-breaker):当系统遇到严重问题时 , 快速回馈失败比让用户/调用者等待要好 , 限制系统出错的体量 , 有助于系统恢复 。 比如 , 当我们去调一个第三方的API , 有很长一段时间API都没有响应 , 可能对方服务器瘫痪了 。 如果我们的系统还不停地重试 , 不仅会加重系统的负担 , 还会可能导致系统其它任务受影响 。 所以 , 当系统出错的次数超过了指定的阈值 , 就要中断当前线路 , 等待一段时间后再继续 。
超时(Timeout):当系统超过一定时间的等待 , 我们就几乎可以判断不可能会有成功的结果 。 比如平时一个网络请求瞬间就完成了 , 如果有一次网络请求超过了30秒还没完成 , 我们就知道这次大概率是不会返回成功的结果了 。 因此 , 我们需要设置系统的超时时间 , 避免系统长时间做无谓的等待 。
隔离(BulkheadIsolation):当系统的一处出现故障时 , 可能促发多个失败的调用 , 很容易耗尽主机的资源(如CPU) 。 下游系统出现故障可能导致上游的故障的调用 , 甚至可能蔓延到导致系统崩溃 。 所以要将可控的操作限制在一个固定大小的资源池中 , 以隔离有潜在可能相互影响的操作 。
回退(Fallback):有些错误无法避免 , 就要有备用的方案 。 这个就像浏览器不支持一些新的CSS特性就要额外引用一个polyfill一样 。 一般情况 , 当无法避免的错误发生时 , 我们要有一个合理的返回来代替失败 , 比如很常见的一个场景是 , 当用户没有上传头像时 , 我们就给他一个默认头像 。
缓存(Cache):一般我们会把频繁使用且不会怎么变化的资源缓存起来 , 以提高系统的响应速度 。 如果不对缓存资源的调用进行封装 , 那么我们调用的时候就要先判断缓存中有没有这个资源 , 有的话就从缓存返回 , 否则就从资源存储的地方(比如数据库)获取后缓存起来 , 再返回 , 而且有时还要考虑缓存过期和如何更新缓存的问题 。 Polly提供了缓存策略的支持 , 使得问题变得简单 。
策略包(PolicyWrap):一种操作会有多种不同的故障 , 而不同的故障处理需要不同的策略 。 这些不同的策略必须包在一起 , 作为一个策略包 , 才能应用在同一种操作上 。 这就是文章开头说的Polly的弹性 , 即各种不同的策略能够灵活地组合起来 。
4使用SkyWalking构建调用链监控
.NET Core微服务实践
文章图片
目前市面上开源的APM(ApplicationPerformanceMonitor)应用性能监测软件主要有CAT、Zipkin、Pinpoint、SkyWalking , 大都是参考Google的Dapper实现的 。
CAT:是由国内美团点评开源的 , 基于Java语言开发 , 目前提供Java、C/C++、Node.js、Python、Go等语言的客户端 , 监控数据会全量统计 , 国内很多公司在用 , 例如美团点评、携程、拼多多等 , CAT跟下边要介绍的Zipkin都需要在应用程序中埋点 , 对代码侵入性强 , 我们倾向于选择对代码无侵入的产品 , 所以淘汰了CAT 。