先开始我们这周的第一个话题。
我在今年2月份的时候看到一篇文章,以至于我对它里面描述的高可用的观点,印象真的很深刻,才导致我又翻开收藏夹去找寻它。当然,也有可能是马上又到双十一了,我们又开始备战了,总之,这周又读了两遍。
为什么有高可用的问题。
首先,本文作者从较大的方面或者说是宏观理论层面做了阐述,我个人认为多少都有点哲学的味道了。
所有的事物都是变化的;
所有的变化都不是100%可靠的;
结论:所有的事物都不是100%可靠的;
因为系统是所有事物的一份子,所以系统是不可靠的,不可靠体现在什么地方呢,就是可用性,结果就是,系统一定会有可用性的问题。
接着,本文作者又分别从内因和外因的角度继续阐述为什么有高可用的问题。
内因上。
人都会犯错;
软件都有可能有BUG;
硬件都有可能会坏;
其实,我们每年做大促备战,也都是无形中遵循这样的基础性原则,做人员的相关培训,辅导,大促负责人以老带新;去寻找系统的薄弱点,找出潜在的风险,并做好各种应对方案;运维组的同学会给设备做巡检,也要做好坏设备的预案。
你看,刚好是人、软件、硬件。
外因上,主要是谈影响面,分别从公司、社会、客户三者的角度去做了阐述。
系统不可用,客户的服务就受到影响了,产生投诉;
系统不可用,一个500强的上市公司的股价,会牵连波动,比如你想想Twitter、Facebook这样的企业;
系统不可用,社会秩序可能会受到影响了,比如12306网站,大家订票出现了问题,人们的出行就会受到影响;
附一张原文中的图
从概率学角度分析,凡是可能会出错的,只要变化次数足够多,最终出错的概率会无限趋向于1。
这有点类似西方的墨菲定律的味道,“凡事可能出错,那就一定会出错”。
关于这篇文章中的更多观点知识大家可以点击文章详细查看。(文章的链接)
---------
再来看第二个话题。
我们拿一个案例来找出其中会有高可用问题的地方。
在电商业务中,会有一个我们很熟悉的场景,抢购或者叫秒杀。
下图是这种场景的一个流程图,这个图选自https://time.geekbang.org/column/article/129823刘超老师的《Java性能调优实战》专栏中的一篇文章。
我现在问你,从这个流程图中你能发现有几个地方会存在高可用的问题吗。
1、详情页
商品详情页的访问量会非常大,几乎所有的用户在抢购时间到来前都会频繁的刷新这个页面,如果这个页面和它对应的服务不做高可用处理,就很容易被刷出404或者502。
对应第一个话题,这是软件的问题。
我们一般的做法是将页面彻底静态化,并将其推送到CDN节点。
2、库存
查询库存,肯定会涉及到数据表,无论是放到缓存中的数据,还是数据库中的数据。由于这些参与抢购的商品,都是单品行为。所以,在我们的数据库里面或者缓存里面就会有热点问题出现。
对应第一个话题,还是软件的问题。没有人的问题吗,人的问题是隐性的,比如你不做热点隔离,不做缓存隔离,知识不到位。
我们一般的做法,就是做隔离,将热数据和常用数据做好隔离。
3、还是库存
查询库存、锁库存、减库存,这是一个流程性的动作,这期间处理不当很容易造成数据不一致的问题。
减库存的方式,一般有下单减库存,付款减库存两种方式。不过这两种方式都有各自的优缺点。下单减库存会造成恶意下单的发生,而付款减库存会到支付的时候有超卖的现象发生。综合这两种方式,其实还有一个实现方式就是预扣库存,然后给一个时间范围,如果在规定的时间内不支付,就取消。像12306我们订火车票就是这样。
这个说的问题表面上看是业务上的问题,实际上也是系统可用性的问题,比如,如果遭到恶意下单你怎么处理,在减库存上如果遇到大并发情况你怎么处理,那么,我们可能就会对系统增加黑名单,限制恶意刷单,给系统增加缓存,另外还有保障系统的事务一致性,提升系统的大并发。
抢购或者秒杀最核心的内容之一,也是在库存上,关于这块内容,可能需要单独一篇更详细的文章来阐述。这里暂时说几个关键的地方。
4、提交订单
这里还是一个隔离的问题,有两个请求一个是详情页的请求,一个是提交订单的请求,我们先前已经知道详情页的请求量非常大,这里如果两个请求相互影响,就会同时造成两个结果受损。
我们常用的做法刚才也提到,还是隔离,比如做域名的隔离,因为详情页疯狂的量有可能给带宽造成一定的压力。
订单量,如果很大,对数据库也需要做改造,比如分库分表,也是一种隔离的思维,来减轻对数据库的压力。
---------
第三个话题。
如果你常看技术书籍或者技术专栏文章,一定会对一本被频繁引用的书籍有印象。就是这本《UNIX 编程艺术》,比如,你随意在极客时间中搜索,便会有下面这些记录,而且我还没有截取完全。足见这本书的魅力。
今天,我也来引用书中的一段话,并浅浅地谈一谈。
《UNIX 编程艺术》:“工程和设计的每个分支都有自己的技术文化。在大多数工程领域中,就一个专业人员的素养组成来说,有些不成文的行业素养具有与标准手册及教科书同等重要的地位(并且随着专业人员经验的日积月累,这些经验常常会比书本更重要)。资深工程师们在工作中会积累大量的隐性知识,他们用类似禅宗'教外别传'的方式,通过言传身教传授给后辈。软件工程算是此规则的一个例外:技术变革如此之快,软件环境日新月异,软件技术文化暂如朝露。然而,例外之中也有例外。确有极少数软件技术被证明经久耐用,足以演进为强势的技术文化、有鲜明特色的艺术和世代相传的设计哲学。“
我理解这里面有几个点,我挨个说一下。
”就一个专业人员的素养组成来说,有些不成文的行业素养具有与标准手册及教科书同等重要的地位“,关于这里面提到的素养,我谈下程序员的素养,大家从网上搜下,大致有如下几类。
扎实的专业技能;
保持良好的编码习惯;
团队精神和协助能力
文档习惯;
需求理解能力;
模块化思维能力;
测试习惯;
学习和总结的能力
保持程序思维;
不断的学习的精神;
保持头脑灵活;
充足的睡眠和持之以恒的锻炼;
保持良好的心态;
时常规划自己的人生;
”确有极少数软件技术被证明经久耐用,足以演进为强势的技术文化“,这里提到的久经耐用的软件技术又有哪些呢。
SOLID;
KISS;
DRY;
LOD;
---------
第四个话题。
这周有一位刚毕业的同学前来问我关于在工作中读书和学习的问题,我也不记得,大概从什么时候开始,每周一般都会有那么几位,觉得我还可以帮助他们的朋友,或者一天有时候就会有3、4位朋友,前来交流。
也借着这篇文章,给大家说是道歉,白天的工作信息太多,我一般回复的问题时间都比较晚,或者有时候都忘记了,过了几天才能够想起来,再又回复对方。但我肯定,尽我所及的答复,或许能给到对方,哪怕一点帮助。
对于初入职场的同学,我总抱有更多可能帮助的态度,我将其这次内容贴在下面,希望对看到这篇文章的其他新同学,有一定用处。
我不是大佬哈
---------
最后,从冯唐的一本书里面,选一段文字,分享给你。
”愿意装逼不已,不愿意认真学习,不能掘井及泉,只是觉得自己了不起,一张嘴就是名词概念,再细问却是一脑子糨糊:热衷谈论国际时政,细问当今美国总统的名字都说不全;热衷谈论投资理财,细问连回报率为何物都说不清。暂时装逼有快感,一直装下去就会在最好的年龄错过真正可以牛逼的机会。多学习,多研究,对真正热爱之事,真正投入精力,向那些可以就防晒美白详细说出八种不同方法的女性好好学习。“
恭喜你,又完成一次思考。