其他
八哥,传说每一位真正的程序猿都被它撩过。即便没见过属于自己的八哥,也见过别人的,若当真没被八哥撩,说明还不是真正的程序猿。有时候你遇到的八哥撩猿技能很高超,特别是在异步程序里,若是该八哥的创造者并没有给它发放一个正确地“身份证”时,你更不容易认得它。今日,我遇到了这样一个八哥,差一点就被撩到七荤八素。有些同学可能对此不以为然,觉得抓八哥都是信手拈来。阿驹认为,只有两种人抓八哥能如瓮中捉鳖,一是姐夫丹那样的神人,二是出身牛犊不怕虎的新人。(PS:若不知姐夫丹其人,欲知详情请公众号中回复“姐夫丹”。)异步代码、分布式系统的调试难度言归正传,从上方图中可以看出,输出这日志的程序内采用了异步编程的方式;而且,该程序是一个分布式系统,多个节点协同完成一个功能;另外,该条异常信息以INFO级别记录了下来。若是倒拐子长毛的猿,已经知道了其难度。不过下面还是给新同学介绍一下难在哪里。文化补遗:“倒拐子长毛”是一句四川话歇后语,谜底是“老手”,和网络流行语“老司机”是同义词。“倒拐子”是指手肘,都长出毛了,肯定是很老的手了。首先,分布式系统其调试难度大,因为功能本是多个节点上的程序协同完成,在测试环境中,若非有良好的打桩和MOCK,还得恰到好处地让发生问题的那段代码被调用,否则是不可能轻易排查掉问题的。然而笨办法就是让各节点的程序都按正常运行,人肉发送能引发错误的请求,打开各节点的日志观察。其次,如果是异步代码,系统往往会默许子例程(这里指被异步的任务)可以执行失败,因为你都提前返回让异步任务自己去运行了,它失败也未尝不可,大不了重新让它执行。所以,异步代码中要找出bug的第一个难度在于往往我们容许错误,而且掩盖了错误。第二个难度在于,被异步执行地任务失败以后不会影响到主程序的运行,即是主程序还能照常提供服务,若不是细心观察,不容易发现它已经出错了。再次,看到上图中该条异常日志的级别,是INFO,这就是典型地没有为八哥发放正确地“身份证”,其“体型”和正常日志也没有太大的外观区别,这让你难以cat