`
onebyte
  • 浏览: 8455 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

服务降级

阅读更多
聊聊高并发系统之降级特技

转载自张开涛的博客

博客分类: 架构
rediscache
​在开发高并发系统时有三把利器用来保护系统:缓存、降级和限流。之前已经有一些文章介绍过缓存和限流了。本文将详细聊聊降级。当访问量剧增、服务出现问题(如响应时间慢或不响应)或非核心服务影响到核心流程的性能时,仍然需要保证服务还是可用的,即使是有损服务。系统可以根据一些关键数据进行自动降级,也可以配置开关实现人工降级。本文将介绍一些笔者在实际工作中遇到的或见到过的一些降级方案供大家参考。

降级的最终目的是保证核心服务可用,即使是有损的。而且有些服务是无法降级的(如加入购物车、结算)。

降级预案
在进行降级之前要对系统进行梳理,看看系统是不是可以丢卒保帅;从而梳理出哪些必须誓死保护,哪些可降级;比如可以参考日志级别设置预案:
一般:比如有些服务偶尔因为网络抖动或者服务正在上线而超时,可以自动降级;
警告:有些服务在一段时间内成功率有波动(如在95~100%之间),可以自动降级或人工降级,并发送告警;
错误:比如可用率低于90%,或者数据库连接池被打爆了,或者访问量突然猛增到系统能承受的最大阀值,此时可以根据情况自动降级或者人工降级;
严重错误:比如因为特殊原因数据错误了,此时需要紧急人工降级。

降级按照是否自动化可分为:自动开关降级和人工开关降级。
降级按照功能可分为:读服务降级、写服务降级。
降级按照处于的系统层次可分为:多级降级。

降级的功能点主要从服务端链路考虑,即根据用户访问的服务调用链路来梳理哪里需要降级:
页面降级:在大促或者某些特殊情况下,某些页面占用了一些稀缺服务资源,在紧急情况下可以对其整个降级,以达到丢卒保帅;
页面片段降级:比如商品详情页中的商家部分因为数据错误了,此时需要对其进行降级;
页面异步请求降级:比如商品详情页上有推荐信息/配送至等异步加载的请求,如果这些信息响应慢或者后端服务有问题,可以进行降级;
服务功能降级:比如渲染商品详情页时需要调用一些不太重要的服务:相关分类、热销榜等,而这些服务在异常情况下直接不获取,即降级即可;
读降级:比如多级缓存模式,如果后端服务有问题,可以降级为只读缓存,这种方式适用于对读一致性要求不高的场景;
写降级:比如秒杀抢购,我们可以只进行Cache的更新,然后异步同步扣减库存到DB,保证最终一致性即可,此时可以将DB降级为Cache。
爬虫降级:在大促活动时,可以将爬虫流量导向静态页或者返回空数据,从而保护后端稀缺资源。

自动开关降级
自动降级是根据系统负载、资源使用情况、SLA等指标进行降级。
超时降级
当访问的数据库/http服务/远程调用响应慢或者长时间响应慢,且该服务不是核心服务的话可以在超时后自动降级;比如商品详情页上有推荐内容/评价,但是推荐内容/评价暂时不展示对用户购物流程不会产生很大的影响;对于这种服务是可以超时降级的。如果是调用别人的远程服务,和对方定义一个服务响应最大时间,如果超时了则自动降级。

之前总结过一些的文章《使用httpclient必须知道的参数设置及代码写法、存在的风险》和《dbcp配置及jdbc超时设置总结》。在实际场景用一定主要配置好超时时间和超时重试次数和机制。

统计失败次数降级
有时候依赖一些不稳定的API,比如调用外部机票服务,当失败调用次数达到一定阀值自动降级;然后通过异步线程去探测服务是否恢复了,则取消降级。

故障降级
比如要调用的远程服务挂掉了(网络故障、DNS故障、http服务返回错误的状态码、rpc服务抛出异常),则可以直接降级。降级后的处理方案有:默认值(比如库存服务挂了,返回默认现货)、兜底数据(比如广告挂了,返回提前准备好的一些静态页面)、缓存(之前暂存的一些缓存数据)。

限流降级
当我们去秒杀或者抢购一些限购商品时,此时可能会因为访问量太大而导致系统崩溃,此时开发者会使用限流来进行限制访问量,当达到限流阀值,后续请求会被降级;降级后的处理方案可以是:排队页面(将用户导流到排队页面等一会重试)、无货(直接告知用户没货了)、错误页(如活动太火爆了,稍后重试)。

人工开关降级
在大促期间通过监控发现线上的一些服务存在问题,这个时候需要暂时将这些服务摘掉;还有有时候通过任务系统调用一些服务,但是服务依赖的数据库可能存在:网卡被打满了、挂掉了或者很多慢查询,此时需要暂停下任务系统让服务方进行处理;还有发现突然调用量太大,可能需要改变处理方式(比如同步转换为异步);此时就可以使用开关来完成降级。开关可以存放到配置文件、存放到数据库、存放到Redis/ZooKeeper;如果不是存放在本地,可以定期同步开关数据(比如1秒同步一次)。然后通过判断某个KEY的值来决定是否降级。

另外对于新开发的服务想上线进行灰度测试;但是不太确定该服务的逻辑是否正确,此时就需要设置开关,当新服务有问题可以通过开关切换回老服务。还有多机房服务,如果某个机房挂掉了,此时需要将一个机房的服务切到另一个机房,此时也可以通过开关完成切换。

还有一些是因为功能问题需要暂时屏蔽掉某些功能,比如商品规格参数数据有问题,数据问题不能用回滚解决,此时需要开关控制降级。

读服务降级
对于读服务降级一般采用的策略有:暂时切换读(降级到读缓存、降级到走静态化)、暂时屏蔽读(屏蔽读入口、屏蔽某个读服务)。在《应用多级缓存模式支撑海量读服务》中曾经介绍过读服务,即接入层缓存-->应用层本地缓存-->分布式缓存-->RPC服务/DB,我们会在接入层、应用层设置开关,当分布式缓存、RPC服务/DB有问题自动降级为不调用。当然这种情况适用于对读一致性要求不高的场景。

页面降级、页面片段降级、页面异步请求降级都是读服务降级,目的是丢卒保帅(比如因为这些服务也要使用核心资源、或者占了带宽影响到核心服务)或者因数据问题暂时屏蔽。

还有一种是页面静态化场景:
动态化降级为静态化:比如平时网站可以走动态化渲染商品详情页,但是到了大促来临之际可以将其切换为静态化来减少对核心资源的占用,而且可以提升性能;其他还有如列表页、首页、频道页都可以这么玩;可以通过一个程序定期的推送静态页到缓存或者生成到磁盘,出问题时直接切过去;
静态化降级为动态化:比如当使用静态化来实现商品详情页架构时,平时使用静态化来提供服务,但是因为特殊原因静态化页面有问题了,需要暂时切换回动态化来保证服务正确性。

以上都保证出问题了有预案,用户还是可以使用网站,不影响用户购物。

写服务降级
写服务在大多数场景下是不可降级的,不过可以通过一些迂回战术来解决问题。比如将同步操作转换为异步操作,或者限制写的量/比例。
比如扣减库存一般这样操作:
方案1:
1、扣减DB库存,2、扣减成功后更新Redis中的库存;
方案2:
1、扣减Redis库存,2、同步扣减DB库存,如果扣减失败则回滚Redis库存;
前两种方案非常依赖DB,假设此时DB性能跟不上则扣减库存就会遇到问题;因此我们可以想到方案3:
1、扣减Redis库存,2、正常同步扣减DB库存,性能扛不住时降级为发送一条扣减DB库存的消息,然后异步进行DB库存扣减实现最终一致即可;
这种方式发送扣减DB库存消息也可能成为瓶颈;这种情况我们可以考虑方案4:
1、扣减Redis库存,2、正常同步扣减DB库存,性能扛不住时降级为写扣减DB库存消息到本机,然后本机通过异步进行DB库存扣减来实现最终一致性。

也就是说正常情况可以同步扣减库存,在性能扛不住时降级为异步;另外如果是秒杀场景可以直接降级为异步,从而保护系统。还有如下单操作可以在大促时暂时降级将下单数据写入Redis,然后等峰值过去了再同步回DB,当然也有更好的解决方案,但是更复杂,不是本文的重点。
还有如用户评价,如果评价量太大,也可以把评价从同步写降级为异步写。当然也可以对评价按钮进行按比例开放(比如一些人的看不到评价操作按钮)。比如评价成功后会发一些奖励,在必要的时候降级同步到异步。

多级降级
缓存是离用户最近越高效;而降级是离用户越近越能对系统保护的好。因为业务的复杂性导致越到后端QPS/TPS越低。

页面JS降级开关:主要控制页面功能的降级,在页面中通过JS脚本部署功能降级开关,在适当时机开启/关闭开关;
接入层降级开关:主要控制请求入口的降级,请求进入后会首先进入接入层,在接入层可以配置功能降级开关,可以根据实际情况进行自动/人工降级;这个可以参考《京东商品详情页服务闭环实践》,尤其在后端应用服务出问题时,通过接入层降级从而给应用服务有足够的时间恢复服务;
应用层降级开关:主要控制业务的降级,在应用中配置相应的功能开关,根据实际业务情况进行自动/人工降级。
分享到:
评论

相关推荐

    springcloud feign整合hystrix(服务降级).doc

    这些方法会被Hystrix装饰,提供服务降级的能力。例如: ```java @FeignClient(name = "service-provider", fallback = ServiceProviderFallback.class) public interface ServiceProviderClient { @GetMapping(...

    37_基于dubbo如何做服务治理、服务降级以及重试?.zip

    在IT行业中,服务治理、服务降级和重试策略是微服务架构中不可或缺的重要组成部分,尤其是在基于Dubbo的分布式系统中。本资料包主要探讨了如何在Dubbo框架下实现这些功能,帮助提升系统的稳定性和容错性。 首先,...

    基于openfeign+sentinel的统一降级服务代码

    此外,Sentinel还支持服务降级,当服务不可用或者响应时间过长时,可以按照预设的策略执行降级操作,如返回默认值、抛出异常或快速失败。 在该项目中,"统一降级服务"意味着开发者不需要为每个OpenFeign接口都单独...

    SpringCloud(Hystrix服务降级)

    为了提高系统的稳定性和可用性,我们需要引入一种机制来处理这种情况,这就是服务降级。Spring Cloud Hystrix 是一个非常重要的工具,它提供了服务降级、断路器、线程隔离等策略,确保了微服务架构中的服务稳定性。 ...

    springCloud_hystrix(断路由服务降级)

    ### Spring Cloud Hystrix:断路由服务降级 在微服务架构中,系统被分解成多个独立的服务单元,这些服务单元之间通过远程过程调用(RPC)的方式进行通信。为了提高系统的可用性和可靠性,通常会将单一的服务进行...

    面试官:Dubbo怎么实现服务降级,他有什么好处?.doc

    Dubbo 服务降级实现方式和好处 在 Dubbo 框架中,服务降级是一种非常重要的机制,它可以在高峰期或服务出现问题时,降低非核心业务流程的服务调用,以免对核心业务流程产生影响。在本文中,我们将探讨 Dubbo 是如何...

    基于Java开发的简单、易用、高性能的服务降级系统,支持限流、熔断和降级等功能,服务端必备!!.zip

    在IT行业中,服务降级是高可用架构设计中的重要组成部分,尤其对于大型分布式系统而言,它可以帮助我们在系统负载过高或部分服务出现故障时,保证核心业务的稳定运行。本项目是一个基于Java开发的简单、易用且高性能...

    springcloud+hystrix(服务降级).doc

    服务降级是Hystrix的一个重要功能,它允许在服务出现故障或响应时间过长时,为客户端提供一个回退策略,以防止整个系统因单个服务的失败而崩溃。 首先,我们需要理解Hystrix的工作原理。Hystrix通过将服务调用封装...

    K2 SUMMIT 服务器降级后重绑TEAM

    ### K2 SUMMIT 服务器降级后的TEAM重绑与注意事项 #### 一、背景介绍 在K2 SUMMIT服务器从高级操作系统(如Windows Server 2008 R2)降级到较旧版本(如Windows XP)的过程中,可能会遇到一些问题。其中最为常见的...

    Feign集成Hystrix实现服务熔断和服务降级案例Java代码.zip

    Feign集成Hystrix实现服务熔断和服务降级案例Java代码

    Apache Dubbo:Dubbo高级特性:服务降级与熔断实战

    Apache Dubbo:Dubbo高级特性:服务降级与熔断实战 Dubbo是著名的RCP框架,文档内有干货,提供代码和可复现的命令,值得借鉴。

    Windows2000中提升域控制器或将其降级为独立服务器.doc

    反之,将域控制器降级为独立服务器,则是从该服务器上删除Active Directory服务,并切换回使用本地用户账户系统(User Account System, UAS)。这两种操作对于网络管理员来说都是非常重要的任务。 #### 提升域控制...

    spring cloud降级服务-hystrix.7z

    Spring Cloud Hystrix 是一个基于 Netflix Hystrix 实现的服务降级、断路器和熔断器框架,它被广泛应用于分布式系统中的容错管理,以提高系统的稳定性和可用性。在微服务架构中,服务间通信是常见的操作,而Spring ...

    Apache Dubbo:Dubbo服务治理:限流与降级策略

    - **服务降级**:当服务调用失败率达到一定阈值时,自动降级,返回预定义的响应。 #### 2. 限流策略的实现 ##### 2.1 基于调用次数的限流 在Dubbo中,可以通过配置`dubbo.consumer.filter`参数来启用限流策略。...

    Apache Dubbo+安装部署+附在均衡+限流与降级+服务熔断等

    ApacheDubbo简介与快速入门 Dubbo核心概念:服务提供者与消费者 Dubbo的安装与环境配置 ...Dubbo的RPC远程调用原理 Dubbo配置与参数详解 ...Dubbo高级特性:服务降级与熔断实战 Dubbo与微服务架构:集成与实践

    优雅降级方案

    优雅降级方案,作为一套前瞻性与实用性并重的技术策略,旨在通过合理规划与实施,使系统在资源紧张或故障发生时仍能维持基本服务,从而保障用户体验与业务连续性。本文将深入探讨天猫交易流控降级方案的核心思想与...

    zookeeper 分布式集群管理应用, Dubbo 实现远程调用 服务降级

    zooKeeper 是一个开放源码的分布式协调服务,主要为了解决分布式架构下数据一致性问题, 它是集群的管理者, 监视着集群中各个节点的状态,根据节点提交的反馈进行下一步合理操作。 最终, 将简单易用的接口和性能...

    华为EC1308固件降级服务器

    在华为EC1308的案例中,"广西固降级ASP服务器"可能是指一个位于广西的服务器,该服务器提供了固件降级的服务或者相关资源。ASP在这里可能是“Application Service Provider”的缩写,即应用服务提供商,意味着这个...

Global site tag (gtag.js) - Google Analytics