高并发系统之降级特技

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

高并发系统之降级特技 博客分类: 架构

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

 

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

 

降级预案

在进行降级之前要对系统进行梳理,看看系统是不是可以丢卒保帅;从而梳理出哪些必须誓死保护,哪些可降级;比如可以参考日志级别设置预案:

一般:比如有些服务偶尔因为网络抖动或者服务正在上线而超时,可以自动降级;

警告:有些服务在一段时间内成功率有波动(如在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脚本部署功能降级开关,在适当时机开启/关闭开关;

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

应用层降级开关:主要控制业务的降级,在应用中配置相应的功能开关,根据实际业务情况进行自动/人工降级。

 

http://jinnianshilongnian.iteye.com/blog/2306477

 

转载于:https://my.oschina.net/xiaominmin/blog/1599198

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

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

相关文章

freeradius 3.0 时间限制_创意营销3.0新模式下,易企秀要成为中国的Adobe

近几年,随着大数据和人工智能技术的发展,智能化、程序化营销在国内获得高速发展。从以创意内容、提升效率的工具到现在驱动企业数字化转型的智能营销,营销云在国内的热度与成熟度不断提升。营销云起源于“Enterprise Marketing Software Suit…

抢占式和非抢占式的进程调度

非抢占式(Nonpreemptive) 让进程运行直到结束或阻塞的调度方式 容易实现 适合专用系统,不适合通用系统 抢占式(Preemptive) 允许将逻辑上可继续运行的在运行过程暂停的调度方式 可防止单一进程长时间独占…

图形学基础知识

本篇主要给大家介绍图形学基础知识,了解Unity图像渲染机制,以及图像渲染管线流程。 主要是因为伴随着VR/AR的飞速发展,为了满足VR高清高帧率的极限渲染,着色器编程(Shader)也成为了Unity程序开发人员的必备…

调度队列模型

调度队列模型及准则 1 仅有进程调度的调度队列模型: 每个进程在执行时都可能出现以下三种情况: (1) 任务在给定的时间片内已经完成,该进程便在释放处理机后进入完成状态 (2) 任务在本次分得的时间片内尚未完成,OS便将该任务再放入…

数据库相关整理

一、MySQL 1、mysql如何做分页 mysql数据库做分页用limit关键字,它后面跟两个参数startIndex和pageSize 2、mysql引擎有哪些,各自的特点是什么? http://www.cnblogs.com/ctztake/p/8453990.html 3、数据库怎么建立索引 create index account_…

api接口怎么对接_系统对接项目管理方面怎么做?从一次项目接口对接说起

故事:最近业务方有一个新的业务合作模式,需要与第三方公司进行系统的对接,原本预期2周可以完成的项目,最后要用到3周时间才能完成,出现的现象其实还挺典型的,也不是没遇到过,因为自己这边的进度…

周转时间 平均周转时间 带权周转时间 平均带权周转时间

1.周转时间 2.平均周转时间 平均周转时间是对n个而言的 3.带权周转时间 真正的运行时间指的是进程占有处理机的时间 4.平均带权周转时间 即n个平均的带权周转时间

unity应用开发实战案例_「简历」STAR法则的实战应用,附手把手教学案例

关注应届生求职网,了解更多求职信息本文共2072字,预计阅读需3分钟本期分享导师-Anna_青云导师51Job职场导师知乎职场千赞答主多年猎头及多行业人力资源管理经历职业生涯规划师、职业生涯咨询师、心理咨询师终身学习践行者、斜杠青年、职场教练在简历优化…

SOA架构设计经验分享—架构、职责、数据一致性

1.背景介绍2.SOA的架构层次 2.1.应用服务(原子服务)2.2.组合服务2.3.业务服务(编排服务)3.SOA化的重构 3.1.保留服务空间,为了将来服务的组合4.运用DDDGRASP进行分析和设计(防止主观的判断导致错误的假设&a…

计算机设备没有音频,电脑没有音频设备怎么办

有些朋友的的电脑没有声音,任务栏右下角也没有小喇叭声音图标,进入到控制面板里面的声音选项里面去设置,在“音量”项目中显示“没有音频设备”,很多朋友遇到这种情况不知道应该怎么解决,今天笔者就电脑没有音频设备怎…

全志科技公司A83T Qt 支持双屏显示

目前A83T支持单屏显示,首屏为LCD或者首屏为hdmi,都使用无论使用SCREEN0还是SCREEN1都是使用FB0作为framebuffer,在android下可以实现LCD和HDMI同样屏幕显示,而我们需要LCD和HDMI分别显示。FrameBuffer采用的是linux下的framebuffe…

明日之后怎么跳过实名认证_明日之后宝箱达人活动怎么玩 明日之后宝箱达人可以开箱多少次...

《明日之后》宝箱达人是今天游戏中更新的活动,玩家们在部分的野外地图中可以找到宝箱。很多玩家都想知道这个宝箱获得的奖励是什么。接下来就让小编给大家带来明日之后宝箱达人活动奖励介绍,一起来看看吧。明日之后宝箱达人活动介绍 一、活动时间2020年9…

JVM内存模型与垃圾回收GC

Java开发有个很基础的问题,虽然我们平时接触的不多,但是了解它却成为Java开发的必备基础——这就是JVM。在C中我们需要手动申请内存然后释放内存,否则就会出现对象已经不再使用内存却仍被占用的情况。在Java中JVM内置了垃圾回收的机制&#x…

伤疤好了有黑印怎么办_春藤家长圈|家有二孩,老大老二一起抢东西,家长该怎么办?...

本期主讲:齐静美国G.T.I.认证父母效能训练师高级家庭教育指导师未来春藤家长学院特聘讲师(西安)五年一线幼儿教学从业经验两个孩子的妈妈每周一次的春藤家长圈线上案例分享时间到啦!本周是我们线上案例分享的第十四期!本周案例:本…

Java_方法

方法就是将一段代码封装在一个结构体中,并且可反复调用 方法的定义: public static 返回值类型 方法名称 ([参数类型 变量, 参数类型 变量,参数类型 变量...]){ 方法中包含的代码; [return 返回…

不懂卷积神经网络?别怕,看完这几张萌图你就明白了

本文来自AI新媒体量子位(QbitAI)这篇文章用最简明易懂的方式解释了卷积神经网络(CNN)的基本原理,并绕开了里面的数学理论。 同时,如果想对从头开始构建CNN网络之类的问题感兴趣,作者推荐去读《 …

2018双一流排名 计算机,2018中国双一流高校名单

目前全球范围内,比较有影响力的世界大学排名包括《QS世界大学排名》、《世界大学学术排名(ARWU)》、《泰晤士高等教育世界大学排名》、《usnews世界大学排名》和CWUR沙特阿拉伯全球大学评级中心世界大学排名。这些排名从各个方面对世界范围内的高校进行综合排名&…

usart和uart 的区别

摘自:https://blog.csdn.net/meic51/article/details/7714847 什么是同步和异步 转自https://blog.csdn.net/seashine_yan/article/details/71192283转载于:https://www.cnblogs.com/chulin/p/8661720.html

苹果产品开发的绝密工作流程

长期以来苹果产品开发流程在很多方面都笼罩着一层神秘的面纱,而在AdamLashinsky新发行的《InsideApple:HowAmerica’sMostAdmired–andSecretive–CompanyReallyWorks》一书中对这些流程有所涉及。这本书同时谈论了苹果公司各个不同的方面,包括其理念、招…