关于架构模式:朴素系统优化思维的实践

48次阅读

共计 4189 个字符,预计需要花费 11 分钟才能阅读完成。

作者:京东物流 严孝男

一、问题

去年年中时候,我有个好敌人(能够叫他华哥)顶着过后还很重大的疫情模式激情守业,斥巨资承包了他原公司食堂的几个摊位,摇身一变成了老板。当了老板的华哥没有丝毫懈怠,岂但做了短缺的市场调研,还联合他本人以前就餐时的痛点做了翻新,比方以前食堂除了最惯例的面,饺子,米线一类的之外就是一份份的卖炒菜,差不多一份荤菜十几块,一份素菜近十块的样子,这就导致一个问题,个别男生花了几十块钱也就只能吃到 2 - 3 个菜,岂但养分不够丰盛,万一踩坑遇到了本来抱有很高期待但发现理论菜并不好吃的状况,体验就更差了。

所以华哥借鉴了市面上麻辣烫自选称重模式的特点推出了自助选菜称重的模式,餐台上会摆放很多种做好的菜(荤素凉都有),大家依据本人的爱好本人打菜,主食的米饭和馒头收费,粥和汤也收费,而后还提供一些免费的主食比方红薯,玉米一类的,打菜的流程就是大家从台子两边按程序开始自选打菜,而后抉择主食,而后抉择汤粥,而后结账刷卡,如下图所示:

华哥不愧是前互联网大厂的金牌产品经理,其敏锐的抓住了用户的痛点,并很好的给出了相应的解决方案,自助称重模式自从推出后就受到了共事们的热烈欢迎,每次都排了长长的队伍,甚至中午 11 点半开餐,不到 11 点 20 就有很多共事在排队等着,写到这里我想举个排长队的例子给大家一个直观的印象,我最开始想到的例子是五道口那个枣糕店门口排的长队,起初一想当初京东 2 号楼 B 座 4 楼餐厅里排瓦罐的队伍如同更贴切。

华哥开始的时候十分开心,但一个月后做了营开盘点发现有点不对,尽管看上去队伍排得很长很火爆的样子,但实际上营收并不如预期。华哥剖析了一下排除了客单价低的因素,自选模式下好多菜大家看到后都想来一点,一来二去就会打好大一盘,根本都是 20 元起步的客单价;而后就剩下单量低这个可能性了,理论剖析一下就能够发现,因为菜的可选种类很多,所以选菜环节每个人须要花很长的工夫选菜,再加上须要打汤和打饭,一个人理论实现整个取餐的过程耗时是很长的,尽管前面的共事能够跟在后面共事前面串行打菜,但因为每个人的爱好不一样,所以每个人在不同菜前的停留时间不一样,这就导致当后面的共事在某个菜盘前耗时稍长的时候,前面的共事是处于期待状态的。

而且有的时候还会遇到一些极其的状况,比方有些共事会在某些他爱吃的菜前停留很久挑挑拣拣,还有些共事会在打收费汤时拿着大勺顺逆时针交替着疯狂搅动,以此希图捞起汤里那些零散的沉底的菜叶和鸡蛋白,华哥就亲眼目睹了他以前汇报的经理在辣子鸡丁菜盆里翻来覆去的寻找隐匿在辣椒深处的那一点点鸡肉,每发现一块鸡肉时经理的脸上还会露出那种称心如意充斥成就感的笑容,话说回来其实在经理挑鸡肉时整个队伍理论是处于齐全停滞状态的,所以综合来看整个队伍的执行就餐过程是十分迟缓的,也就导致理论打完餐付费的人数并不如设想中多。

二、计划

起初在一次好友团聚时,华哥和我聊起了这个事件,他问我:你们搞技术的不都各种吹牛什么系统优化,降本增效一类的吗,你帮我想想方法。听完华哥这略带寻衅象征的要求,我忽然感觉本人身上有了很重的责任感,感觉本人要守住技术人的尊严。于是本人好好想了想,而后感觉这个商业问题实际上也能够看成一个技术问题,这个餐台能够看成一个零碎,打餐的流程能够认为是零碎的一次交互流程,每个打菜的共事能够看成是一次调用,因为每次调用执行起来的性能太差,导致系统整体的吞吐量太低,影响了整体零碎的效力,因而整个零碎的效力很低,尽管过后曾经是酒过三巡,脑子不太苏醒了,然而本人还是尽力给华哥想了好几个方法。

2.1 零碎扩容

第一个想到的方法就是扩容,在工程技术畛域当遇到零碎性能不达标时,第一个想到的解决方案也个别都是扩容,工程畛域里的扩容个别能够分垂直扩容和程度扩容两种形式:垂直扩容是通过晋升单体实例的硬件能力来晋升单体解决能力,程度扩容则是通过减少实例节点的形式来减少整个零碎的解决能力。

套用这两个实践,看看怎么晋升餐台的吞吐,如同垂直扩容这块能做的不多,总不能把打饭的勺子降级一下变成德国原装进口低温武火蹴练镀金勺吧;不过尽管垂直扩容没什么好方法,然而程度扩容如同能做的事件很多了,只有多减少几套打菜餐台,这样并行执行的 2 条打饭队伍就能够变成 4 条,甚至 8 条,间接实现了多线程并发,这样零碎整体的吞吐能力能够立马取得翻倍式晋升,成果岂但奏效块,成果也堪称是空谷传声,于是我给画了一个程度扩容示意图,如下图所示:

不过程度扩容的计划很快就被华哥否了,尽管在工程技术畛域,随着云原生技术的成熟,利用级别的扩容缩容都是很成熟的晋升零碎解决能力的解决方案了,然而在华哥这里,想再搭一个餐台是不可能的,且不说华哥承包的摊位没有这么大的中央去搞第二个餐台,就算有,从新施工装修,水电革新一系列的老本也简直是不可能实现的。

尽管这个世界上能用钱解决的问题都不叫问题,但当初的问题是华哥没钱了。

2.2 单次执行优化

晋升零碎并发能力的路走不通后,那么晋升零碎的吞吐量的方法就是缩短单条申请的解决执行工夫,这样单位工夫内零碎解决的申请条数就会有晋升,从而晋升零碎吞吐量,那回到餐台这里,就变成了须要缩短单人打餐的工夫,尤其是遇到华哥前经理那种在单个菜盘前会消耗大量工夫的状况该如何优化呢?

咱们拆分一下每次调用,把在每个菜盘前打菜的过程能够模仿了解为执行一段逻辑,这样全副的打菜过程能够被拆解成一个个小的代码块,总的调用工夫是由这些代码块的执行工夫之和决定的,从工程技术视角的话就是保障每段逻辑都在一个可预期的工夫内实现,所以每段逻辑都能够通过一个超时判断逻辑来管制每段代码的执行工夫,这里举一个百度搜寻的例子,百度为了加强返回后果的多样性,推出了阿拉丁架构,每个 query 通过星图模型解析后会分发给不同的垂类,每个垂类会加工生产属于本人业务畛域的卡片,而后阿拉丁的 root 利用聚合垂类返回的各个后果并返回给用户,那某些垂类场景执行会比较慢,比方当遇到用户搜一款药的场景时,衰弱垂类的利用会依据搜寻人的经纬度筛选左近的 o2o 的药店,并计算该药品在该门店的促销折扣价,这种计算往往会耗时很久,所以 root 利用会减少一个 380ms 的超时判断,对所有的垂类利用都是一样,当你返回的内容超过这个工夫后后果会被抛弃,举这个例子让大家能够明确通过减少对每个环节的超时设置,这样能够保障整体的流程在一个可控的工夫范畴内失去执行,从而保障用户体验的一致性。

程序里的超时好加,因为程序没有喜怒哀乐,但打餐的场景不一样,总不能在每个菜前面安顿一个服务员在背地数 123 计时,超过 5s 往前推他一把,总不能这样吧,究其原因就是打菜是主观能动的,他想在一个菜前停多久就停多久,想到这个问题后,我有了主见,把用户自主停留的权力给剥夺,发明对立的停留时间,所以我给华哥设计了一套超时安装,那就是在餐台的两边各减少一套主动传送安装,相似于飞机场里安检后赶去航站楼的传送带一样,这样人们在两边打菜时不须要本人走动了,而且每个人在每个菜盘前停留时间是一样的,就不会呈现一个人在某个菜前停留时间过久的问题,也防止了餐台因后面某个人的长时间停留而呈现整体停滞的问题,晋升了餐台的吞吐量,而且传送带的减少还有个益处就是人不多时能够开得很慢甚至停掉,在高峰期时能够适当减少传送带的速度,从而管制每一个人打菜的工夫,保障整个餐台的吞吐率。

华哥听到我这个有点蠢才的想法后愣了很久,盘算了一下可能性后他感觉这个方法还真的可行,只是须要等到十一或者五一长假期间动工在两边减少传送带,终于听到一个可行计划的华哥有点兴奋,两腮也泛出了点点的红晕。

2.3 非核心流程剔除

看到华哥接收了我的这个计划,我登时感触到了很大的激励,于是又持续思考这块流程还能怎么优化,在工程技术畛域,一个流程在接受很大流量时还能够做的一个事件就是流程简化,只保留外围的流程环节,也就是大家常说的黄金流程,而将非核心的业务节点从主流程中剔除,这样精简后的主流程能够肯定水平上缩短执行工夫,而且主流程执行的逻辑少了,出错的概率也同时就升高了,举一个京东批发的下单计算流程为例,批发侧结算时须要做以下的事件:

实际上结算这块还有很多的非次要节点要解决,比方删除购物车中相干已结算商品,预占自提柜等等,然而这些属于非核心的流程,能够从主流程中剔掉。

回到餐台这里,什么流程是黄金流程,没错,就是那些和营收间接相干的流程,而那些不产生收益的我的项目,比方米饭馒头,汤粥的环节就能够认为是非次要流程,能够从主流程中剔掉,这样一直简化了大家取餐的主流程,而且还节俭了餐厅的空间,残余的空间能够用来做几件事,一个是能够多放一些免费的主食或者减少一些菜品,以此能够增加收入,第二个能够减少一些自助收银设施,之前 2 个收银台在之前打餐比较慢时能够满足需要,但当初整个流程简化了,整体每个人的打餐速度晋升了,这样 2 个收银台就会变成新的瓶颈,尤其是遇到有扫码直付的同学就会瓶颈的更显著,这样通过减少收银台的数量,从而晋升了收银环节的并发解决能力,保障了整个取餐流程的晦涩,防止新的性能瓶颈的呈现,完满!

华哥听完这个倡议很称心,他正嫌餐台太小摆放的菜系不够多呢,这样空间被更正当的利用到能带来收益的食品上了,正合华哥之意,华哥很开心的敬了我一个。

2.4 分布式缓存

除此之外,互联网减少零碎吞吐能力,缩短单次执行工夫的一个很次要的法宝利器就是利用分布式缓存技术,分布式缓存技术能够让很多存在零碎瓶颈的调用通过缩短数据获取工夫从而极大缩短解决工夫,在这里分布式缓存技术是不是也能够利用到餐台这里呢。

我想了一下,后面从主流程中拿掉的收费主食局部和汤粥局部能够利用缓存的原理,尤其是 CDN 缓存的原理,把主食和汤粥分布式的放在离共事们就餐的餐桌左近,这样能够让就餐的共事们最近范畴就能够盛到主食和汤粥,外表上看对营收没晋升,但实际上一是大家打饭近了,就餐体验好了,二是大家打饭加饭不便了,就餐的工夫就会升高,从而晋升餐桌的利用率。保障下一个打到饭的共事能疾速找到座位,体验同样也会晋升。这里我就不画图了,置信大家都能明确。

三、后记

华哥整体听完我的优化计划后抬头陷入了深思,许久之后他抬起头看着我,眼神有些许迷离,我登时有点缓和,认为他要零碎点评一下我的计划,没想到华哥闭口问我的是,当初几点了,我才意识到华哥方才是喝多了抬头睡着了。

正文完
 0