作者:京东物流 严孝男

本文正在参加「金石计划」

一、问题

上一年年中时分,我有个好朋友(能够叫他华哥)顶着其时还很严峻的疫情方法激情创业,斥巨资承包了他原公司食堂的几个货摊,摇身一变成了老板。当了老板的华哥没有一点点松懈,不光做了足够的市场调研,还结合他自己曾经就餐时的痛点做了创新,比方曾经食堂除了最惯例的面,饺子,米线一类的之外便是一份份的卖炒菜,差不多一份荤菜十几块,一份素菜近十块的姿态,这就导致一个问题,一般男生花了几十块钱也就只能吃到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缓存的原理,把主食和汤粥分布式的放在离搭档们就餐的餐桌邻近,这样能够让就餐的搭档们最近范围就能够盛到主食和汤粥,表面上看对营收没提高,但实践上一是我们打饭近了,就餐体会好了,二是我们打饭加饭方便了,就餐的时刻就会降低,然后提高餐桌的利用率。确保下一个打到饭的搭档能快速找到座位,体会同样也会提高。这儿我就不画图了,相信我们都能理解。

三、跋文

华哥全体听完我的优化计划后垂头陷入了深思,许久之后他抬起头看着我,目光有少许迷离,我顿时有点紧张,认为他要体系点评一下我的计划,没想到华哥开口问我的是,现在几点了,我才意识到华哥刚才是喝多了垂头睡着了。