近期来势汹汹的新型冠状病毒成为公众关注的焦点。笔者最近在过年的时候看了一些相关的新闻和书籍。其中,有一本书叫卡尔齐默♂,给我留下了深刻的印象。当然,本文不谈新型冠状病毒和《病毒星球》,而是将故障与病毒进行对比,讲计算机软件的故障响应机制,病毒科普资料资料来自《病毒星球》这本书。1、故障:计算机软件中潜伏着病毒人类鼻病毒作为感冒和哮喘的元凶,是人类的老朋友了。鼻病毒巧妙地利用鼻粘液来传播自己。当一个人擤鼻涕时,病毒会趁机跑到手上,然后通过手摩擦门把手等手接触过的地方。下次其他人触摸这些地方时,病毒会沾到他们的手上,然后进入他们的身体——主要是通过他们的鼻子。鼻病毒巧妙地诱骗细胞为它们打开一扇“小门”,侵入鼻子、喉咙或肺部的细胞。在接下来的几个小时里,鼻病毒利用宿主细胞,复制它们的遗传物质和包裹它们的蛋白质外壳。然后,这些复制的病毒会脱离宿主细胞。此外,我们每个人的基因组中都携带着近10万个内源性逆转录病毒的DNA片段,占人类DNA总量的8%。虽然这类病毒的大部分DNA是无用的,但我们的祖先确实“征用”了一些对我们有益的病毒。如果没有这些病毒,我们甚至不会出生。在进化史上的最近时刻,人类脱颖而出,而病毒对我们的生存起到了重要作用。首先,没有“他们”和“我们”这样的东西——生物本质上只是一堆不断混合、变化的DNA。因此,鼻病毒在几千年前就开始在古埃及人中感染感冒,内源性逆转录病毒在数千万年前侵入了我们灵长类祖先的基因组。(摘自《病毒星球》)失败也类似,就像生物体的DNA片段纠缠在电脑软件中,无法分离。现在的软件开发迭代频繁,我们很难杜绝所有的故障。只能说尽可能多的去发现和解决问题,避免生产环境出现故障,造成线上问题。当我们被病毒感染时,细胞会释放称为“细胞因子”的信号分子,调用附近的免疫细胞。它们使我们的身体产生炎症反应,等待免疫系统帮助我们清除体内的所有病毒。在计算机软件中,我们也有类似的场景。一旦我们的开发人员或测试人员确认是程序BUG,他们会立即记录下来并通知相关人员进行处理和修复,并持续跟踪直到故障解决。2.听过很多案例,还是解决不了问题。寒冷是如此顽固。一个原因是它以多种形式存在,因为它带来了基于突变和快速复制的遗传多样性。面对故障,虽然底层的熔断器可能只有几种,但计算机软件整体的复杂性是由于技术和业务的复杂性。我们知道NPE(NullPointerException)会给我们带来巨大的灾难,但是在实际的研发中我们往往会忘记或者忽略它。在这里,由于没有对被检查的对象进行非空测试,导致NPE失败。publicstaticvoidnpe03(){Personperson=null;System.out.println(person.blog);}下面这个例子会导致NPE,你发现了吗?publicstaticvoidnpe01(){Integerx=1;Integery=2;Integerz=null;Integerval=false?x*y:z;}而这个例子也是一个非常典型的Java自动装箱和拆箱导致的NPE失败。publicstaticvoidinvoke(){Longx=null;npe02(x);}publicstaticvoidnpe02(longx){System.out.println(x);}再说一个有趣的故障问题。大家都知道CPU会因为死循环而100%。然而,100%CPU的原因是多种多样的。笔者团队曾经遇到过一个JDK8的bug,是由于递归创建ConcurrentHashMap对象扩展导致死循环导致的。文章链接:《ConcurrentHashMap.computeIfAbsent 死循环》。3.故障应急机制:监控、告警、预案通常情况下,一旦出现线上故障,后果一般都很严重。因此,我们需要尽快解决它,以减少其影响和资金损失。比如我们团队之前的口号是:“1-5-10”,即一分钟发现,五分钟处理,十分钟解决。那么,如何快速查找线上故障呢?搭建成熟的监控系统非常重要,比如通过Zabbix或Prometheus监控各种基础设施(MySQL、Redis、MongoDB、ElasticSearch等)的运行情况,以及业务系统的状态。运行状态,还有CPU、内存、磁盘I/O、网络I/O等波动,还有GC状态、binlog同步状态等,那么发现问题后,需要联系故障处理人员根据业务规则通过报警系统通过多种渠道(邮件、钉钉、电话)处理。应该怎么做才能快速解决呢?首先,我们需要一个完整的日志排查系统(日志聚合+链路追踪)。此外,我们还需要快速dump出JVM相关的栈信息,并有DevOps平台支持进行自助分析。但是,最重要的是要有一个计划系统。什么是预先计划系统?意味着有一套完整的预案可以快速应对不同的问题。比如某个服务不可用,作者发现进程假死了,那么就可以通过计划中的执行计划执行shell脚本,快速拉动它工作。再比如,笔者通过监控报警感知到某商户的资金出现异常波动,那么此时通过计划中的执行计划,通过动态切换的方式快速熔断。但是,如果这次上线失败没有应急预案,难度更大,怎么办?碍于头皮,没有别的办法,只能对付。需要注意的是,故障的等级一般是根据业务影响范围来确定的。事实上,最本质的财务损失包括直接资本损失。比如前段时间,某知名电商的免费优惠券,造成了非常严重的资金损失。;间接的资金损失,比如把电缆挖掉,让整个app无法使用,再换算成正常的交易量,也是一笔巨大的资金损失。那么,2小时后,故障仍未修复,原先分级为P2的故障可能升级为P1。如果最坏的情况发生,可能短时间内无法解决,那么很可能需要停机检修。比如近期来势汹汹的新型冠状病毒,导致全国范围内封城封路。其实也是因为我们没有特效药(计算机软件领域的预防方案),还没有研发新药(计算机软件领域的解决方案),所以只能封城封路(停止计算机软件领域的服务)。4、及早发现故障——故障预演通常情况下,偶尔的感冒会提供我们的免疫力。在计算机领域,偶发故障演练也能尽可能保证线上运行的系统没有缺陷和故障。在这里,Netflix为处理不确定性领域带来了一种新的思维方式:混沌工程。事实上,混沌工程提倡我们积极接受系统会存在缺陷和故障,然后我们通过一系列的实验找出可能出现问题的风险点,然后不断地强化系统。故障演练可以模拟CPU满载、kill指定进程、访问域名失败、网络延迟、网络丢包、磁盘填满、磁盘IO高等场景,如下图。综上所述,故障就像潜伏在计算机软件中的病毒。由于技术的复杂性和业务的复杂性,很难排查和解决。可以通过监控、告警、预案、故障演练等手段,提早发现故障并解决问题。过错。
