当前位置: 首页 > 后端技术 > Java

下面我从抗脆弱的角度说一下:技术系统的高可用策略

时间:2023-04-02 01:53:52 Java

1非线性我们先介绍一个概念:非线性。这个概念在我们的生活中无处不在。你必须在早上8点赶火车。如果6:30出发,7:00可以到站,所以得出一个结论:到站只需要30分钟。你想早上晚点睡,预计7点10分离开,认为你可以在7点40分到达车站。但最有可能的结果是你会误了火车。因为刚好是早高峰,堵车至少要1个小时才能到站。一个小雪球重100克,打雪仗被打100次对你没有任何影响。但是,如果您被10公斤重的雪球击中1次,您可能会受重伤。这是非线性的。事物并不是简单的叠加关系。当达到某个临界值时,就会造成完全不同的结果。2闪杀系统我们来分析一个互联网闪杀场景。假设你设计的秒杀系统在每秒30人访问时响应时间为10毫秒。也就是说,从用户点击按钮到得到结果只用了10毫秒。这段时间的流逝基本感觉不到,表现不错。你觉得不错,继续设计:30visitspersecond,responsetime10milliseconds300visitspersecond,responsetime100milliseconds3000visitspersecond,responsetime1000milliseconds如果按照这个思路做系统设计,就会出现重大错误.因为当发生每秒3000次访问时,系统的响应时间可能不是1000毫秒,而是可能直接导致系统崩溃,无法再处理任何请求。最常见的场景是缓存系统出现故障,造成系统雪崩:当低耗时的缓存层出现故障时,流量直接发送到高耗时的数据库层,用户的等待时间会增加。如此一来,用户访问更频繁,更多的流量会被送到数据库层,进一步增加了用户的等待时间,从而再次导致访问更频繁。当访问量达到一个限制值时,系统就会崩溃,无法处理任何请求流量,而Responsetime绝不是简单的叠加关系。当达到某个临界值时,系统会直接崩溃。3、黑天鹅和三体天鹅欧洲人一直认为只有白天鹅,因为他们只见过白天鹅。他们的想法有多坚定,当他们在澳大利亚发现一只黑天鹅时,就会有多震惊。这就是著名的黑天鹅事件的由来。黑天鹅事件是指事前无法预测,一旦发生将产生巨大影响的不确定事件。我们来分析一下欧洲人的白天鹅理论。他们采用了归纳推理的方法,这也是科学实验中常用的方法。在他们看到黑天鹅之前,确实只有白天鹅存在。可当黑天鹅一出现,整个认知瞬间崩塌。一个更有趣的系统是混沌系统。这个系统最大的特点就是当一个小的扰动发生时,会对整个系统产生巨大的影响。混沌系统的典型表现是蝴蝶效应和三体问题。蝴蝶扇动翅膀可以制造飓风。在相互引力作用下,三颗天体的运动轨迹变幻莫测,这也是刘慈欣《三体》三部曲的基本设定。在混沌系统中,我们不知道黑天鹅事件何时何地以何种形式发生。不知道7点出发会被堵多久,不知道秒杀系统在开始抢的那一刻会有多少访问量,不知道某个消息的公布会激增多少流量微博上的大V。4工程系统稳定性我们来思考一个问题:如何保证一个工程系统的稳定性?有两种做法:思路一:考虑所有突发情况,对每一种突发异常情况分别处理。思路二:接受所有意外情况都无法预料的现实,做一个自下而上的计划,确保即使在极端情况下,系统也不会崩溃。如果我们仔细分析思路1,就会发现这其实是一个悖论。所谓意想不到的情况,就是意想不到的情况,无法预见的情况。如果考虑在内,就不能称之为意外。塔勒布一直想在他的经典著作《反脆弱》中告诉我们:黑天鹅事件不可预测,极端事故不可预测。尾部风险虽然概率小,但破坏力大。我们无法预测会发生什么故障以及它们何时会发生。但面对不确定性,我们不会放过它,至少我们可以保护系统。5高可用策略为了保证系统的稳定性和高可用,我们需要采取一些策略。我认为高可用的核心策略一般包括:冗余+自动故障转移策略、降级策略、延时策略、隔离策略。高可用的实际应用方案多种多样,但一般都采用上述策略来构建稳定的高可用工程系统。5.1冗余+自动故障转移策略最基本的冗余策略是主从模式。原理是准备两台机器,部署相同的代码,在功能层面是相同的,可以对外提供相同的服务。一台机器开始提供服务,这就是主服务器。另一台机器启动和待机,不提供服务,随时监控主服务器的状态。这是从属服务器。当发现主服务器出现故障时,从服务器立即代替主服务器继续为用户提供服务。自动故障转移策略是指当主系统出现异常时,应该能够自动检测到异常并自动切换到备系统。不能只靠人工切换,否则排除故障的时间会大大增加。5.2降级策略所谓降级策略就是当系统遇到无法承受的压力时,选择暂时关闭一些非关键功能,或者延迟提供一些功能,将此刻的所有资源提供给最关键的服务.在秒杀场景下,下单是最核心也是最关键的功能。当系统压力即将达到临界值时,可以暂时关闭一些非核心功能,如查询功能。秒杀活动结束后,暂时关闭的功能将再次开启。这样既保证了秒杀活动的顺利进行,又避免了系统崩溃。还有一个降级策略。当系统所依赖的下游服务出现错误,甚至完全不可用时,那么此时就不能调用下游服务,否则可能会造成雪崩。于是直接回归底线解决方案,直接降级下游服务。5.3延时策略用户下单成功后,需要付款。假设秒杀系统以每秒3000次的访问量下单,我们想一个问题,是否需要将每秒3000次访问量的压力传递给支付服务器?答案是没有必要。因为用户可以在秒杀成功后进行后期支付,比如可以跳转到一个支付页面,提示用户在10分钟内完成支付。这样一来,每秒3000次的访问被分成了几分钟,有效的保护了系统。技术架构也可以使用消息队列作为缓冲,让支付服务根据自己的能力处理业务。5.4隔离策略物理隔离:应用部署在不同的物理机、不同的机房,资源之间不会相互影响。线程隔离:对不同的请求进行分类,交给不同的线程池处理。当一类请求耗时异常时,不影响另一类请求的访问。6拥有了一切,便拥有了一切《孙子兵法》文章告诉我们一个道理:准备好前方,便拥有后方;准备好前方,便拥有后方;备后,则有前。备左,必有右。一切。力量集中在前面,后面空虚。力量集中在后面,前面是虚的。力量集中在左边,右边空虚。权力集中在右边,左边是空的。若功散于前、后、左、右,则前、后、左、右为空。不确定性四处散布,不可预测。我们不可能把精力分散在前后左右,但技术人员至少可以做好一件事:保护系统。