作者:等不及口琴\来源:www.cnblogs.com/Courage129/p/14427020.html什么是服务降级?如果你看过我之前关于服务限流的分析,就很容易理解服务降级,对于一个景区来说,平时可以随便进出,但是到了春节或者国庆客流激增的时候国庆期间,景区将限制同时入园人数。砍掉一些不重要的景区项目。一般只有三五八人。景区可开湖游泳、钓鱼、捉虾。有的时候工作人员可以下到湖边抓你,但是现在人流量大已经来不及了,工作人员也顾不上了,都在湖里晃来晃去。万一沉了,就不安全了,他一挥手,项目就断了,人员也都调到别的地方去了。网上也有类似的降级措施。和之前的双11一样,有一段时间只允许下单,不允许退改。这样做的目的是什么?或者说为了保证服务的可用性,当硬件和软件都优化到一定程度时,资源还是有上限的。这个时候资源会集中在核心业务上,不重要的会砍掉,保证服务的可用性。服务级别定义服务级别协议(SLA)是判断压测是否异常的重要依据。在压测过程中,通过监控核心服务状态的SLA指标数据,可以更直观的了解压测业务的状态。SLA是服务提供商同意您的正常运行时间保证。关于这个的详细解释,可以参考阿里云的介绍:ServiceLevelDefinitionSLA(https://help.aliyun.com/docum...),这里不再赘述,SLA分为网络服务和云服务,提供商的在线保证率通常要求达到69。六个九就是六个九就是99.9999%,也就是一个服务有99.9999%的概率是安全的,那么六个九到底有多安全呢?两个九=(1-99%)X24X365=87.6小时=3.65天3个九=(1-99.9%)X24X365=8.76小时4个九=(1-99.99%)X24X365=0.876小时=52.56分5个9=(1-99.999%)X24X365=0.0876小时=5.256分6个9=(1-99.9999%)X24X365=0.00876小时=0.5256分=31秒也就是说一年中,六个九的安全性最多会有31s服务不可用,相对来说是极高的。降级处理口袋数据的例子有很多。比如有的页面挂了,会返回到找父子网。可以为一些关键数据设置一些口袋数据,比如设置默认值,静态值,设置缓存等。默认值:设置一个安全的默认值,一个不会造成数据问题的值,比如库存为0静态值:请求的页面或api不能返回数据,提供一组静态数据展示,比如加载失败提示重试,或者找亲子网,或者跳转到默认菜单,给用户稍微好一点的体验。缓存:如果缓存无法更新,则使用旧缓存降级限流。顾名思义,就是预先为每一种请求设置最高的QPS阈值。如果高于设置的阈值,则请求直接返回,不调用后续资源,即当流量高峰到来时,可能需要丢弃部分用户以保证服务可用性,对于丢弃的用户可以进行友好提醒用户,例如提示用户当前正忙,稍后再试。限流需要结合压力测量来了解系统的最高水位,也是实际开发中使用最广泛的稳定性保障方式。当服务器压力急剧增加时,根据当前业务情况和流量,对部分服务和页面进行策略性降级,以释放服务器资源,保证核心任务的正常运行。超时降级设置调用数据的超时时间。当呼叫失败时,服务被降级。比如访问数据已经超时,业务不是核心业务,超时后可以降级。例如在商品详情页推荐内容或评论,但可以降级显示,暂时不显示。这对主要的用户功能——购物没有影响。如果是远程调用,可以协商一个双方都能接受的最长响应时间。如果超时,会自动降级。故障降级如果远程调用的服务器挂了(网络故障、DNS故障、HTTP服务返回错误),可以进行降级,比如返回默认值或者pocket数据或者静态页面,或者返回之前的缓存数据。重试/自动处理客户端高可用:提供多个可调用服务地址,做这个微服务重试:dubbo重试机制API调用重试:达到重试次数时,增加访问标记,服务降级,异步探测服务是否恢复。WEB端:当服务不可用时,在Web端添加重试按钮或自动重试,可以提供更友好的体验。自动重试需要设置重试次数和数据幂等处理降级开关。在服务器支持期间,如果监控到的部分在线服务出现问题,此时需要暂时移除这些服务。有时候通过服务调用一些服务,但是服务依赖的数据库可能存在,网卡满了,数据库宕机,有很多慢查询等,这时候要做的就是暂停相关的系统服务,即手动使用开关降级。switch可以放在某个地方,switch数据定时同步,通过判断switch的值来决定是否降级。交换机降级也有一个功能。比如新的服务版本刚刚在灰度测试阶段,不确定里面的逻辑是否正确。如果出现问题,则应根据开关的值切换回旧版本。在服务调用者上设置标志以标记服务是否可用。另外,key可以存储在本地,也可以存储在第三方的配置文件中,如数据库、redis、zookeeper等。爬虫和机器人分析机器人行为:短时间持续运行、代理、行为跟踪、拖拽(模拟登录/秒杀/填报)爬虫:导致静态页面或缓存页面读取降级简而言之,一次请求内,多次下级缓存架构,后端缓存或db不可用,可以使用前端缓存或口袋数据,让用户体验更好。读服务降级的一般策略是:临时切换读:降级为读缓存,降级为静态临时屏蔽读:屏蔽读入口,屏蔽某一个读服务通常的读流程是:接入层缓存→应用层本地缓存→分布式cache→RPCservice/DB我们会在接入层和应用层设置开关,当分布式缓存和RPCservice/DB出现问题时,会自动降级为不调用。当然,这种情况适用于对读一致性要求不高的场景。页面降级,页面分片降级,页面异步请求降级,都是读服务降级,目的是保证pawn安全,保护核心线程,或者因为数据问题暂时阻塞。还有静态页面的场景。动静降级:比如平时网站可以动态渲染商品详情页,但是当大促来临的时候,可以切换成静态,减少核心资源的占用,提高性能。其他如列表页、首页、频道页等都可以这样处理。可以通过程序周期性的将静态页面推送到缓存或者生成到磁盘,出现问题的时候直接裁掉。静态降为动态:比如在使用静态实现商品详情页结构时,通常使用静态提供服务,但是由于特殊原因,静态页面出现问题,需要暂时切换回动态以保证服务的正确性。以上一切,确保出现问题时有预案,用户可以继续使用网站,不影响用户的购物体验。写降级大家都知道硬盘性能不如内存性能。如果访问量很大,数据库可能无法承受频繁的读写。记录执行的指令,然后将这些信息发送给数据库,即不再追求内存和数据库数据的强一致性,只要数据库数据和Redis数据库中的信息满足最终一致性即可。也就是说,正常情况下,可以同步扣库存,当性能不堪重负时,可以降级为异步。另外,如果是秒杀场景,可以直接降级为异步来保护系统。另外,下面的订单操作可以在大促期间暂时降级,将订单数据写入Redis,过了峰值后再同步回DB。当然还有更好的解决方案,但是比较复杂,不是本文的重点。另一个例子是用户评价。如果评估量过大,也可以将评估从同步写入降级为异步写入。当然评价按钮也可以按比例打开(比如有些人看不到评价操作按钮)。例如,评估成功后,会发放一些奖励,必要时,会从同步降级为异步。综上所述,在cap原则和BASE理论中,写操作存在于数据一致性这个环节。降级的目的是提供高可用性。在大多数互联网架构中,可用性大于数据一致性。因此,写入数据的同步丢失。通过以上理论,我们勉强可以接受数据的最终一致性。在高并发场景下,写操作无法及时到达或承受压力。可以异步消费数据/缓存更新/日志等方法。前端降级当系统出现问题时,尽量将请求隔离在离用户最近的位置,避免无效链接的访问,当后端服务部分或完全不可用时,可以使用本地缓存或口袋数据。在一些特殊场景下,当数据一致性不高时,比如秒杀、抽奖等,可以做假数据。JS降级埋藏在js中的降级开关中。当访问没有达到系统阈值时,可以避免发送请求,主要控制页面功能的降级。在页面中,通过JS脚本部署功能降级开关,并在合适的时候打开/关闭开关。接入层降级可以在接入层完成。当用户请求还未到达服务时,通过Nginx+Lua、Haproxy+lua过滤无效请求,达到服务降级的目的。主要控制请求入口的降级。请求进入后,会首先进入接入层,这里可以配置功能降级开关,可以根据实际情况进行自动/手动降级。对此请参考第17章,尤其是当后端应用服务出现问题时,应用服务有足够的时间通过接入层降级来恢复服务。应用层的降级主要控制业务的降级,在应用中配置相应的功能开关,根据实际业务情况进行自动/手动降级。在SpringCloud中,可以通过Hystrix配置中心进行手动降级,也可以根据服务的超时时间进行自动降级。Hystrix是Netflix开源的一个分布式系统的延迟容错库。目的是隔离分布式服务故障。提供线程和信号量隔离,减少不同服务之间因资源竞争造成的相互影响;官网说Hystrix提供了优雅的降级机制;它提供了一种熔断机制,使服务可以快速失败而不是阻塞等待服务响应,并且可以从中快速恢复。Hystrix使用这些机制来防止级联故障并确保系统弹性和可用性。下图是一个典型的分布式服务实现。分片降级比如你打开淘宝首页,这一刻需要加载很多数据,包括静态图片、CSS、JS等,还有很多其他的产品。如果不请求某些数据,则可以降级该片段。这意味着这些数据将不会被加载,并被其他数据替换,例如其他产品信息等。提前预购很容易理解。大家要记住,每次双十一之前,淘宝总会提醒大家下载更新。按理来说,活动还没开始,更新什么?方法是提前一些静态数据。更新到手机上,双十一不需要远程连接服务器加载,避免了网络资源的消耗。近期热点文章推荐:1.1,000+Java面试题及答案(2021最新版)2.别在满屏的if/else中,试试策略模式,真的很好吃!!3.操!Java中xx≠null的新语法是什么?4、SpringBoot2.5发布,深色模式太炸了!5.《Java开发手册(嵩山版)》最新发布,赶快下载吧!感觉不错,别忘了点赞+转发!
