博客 / 詳情

返回

樸素系統優化思維的實踐

作者:京東物流 嚴孝男

一、問題

去年年中時候,我有個好朋友(可以叫他華哥)頂着當時還很嚴重的疫情形式激情創業,斥巨資承包了他原公司食堂的幾個攤位,搖身一變成了老闆。當了老闆的華哥沒有絲毫懈怠,不但做了充足的市場調研,還結合他自己以前就餐時的痛點做了創新,比如以前食堂除了最常規的面,餃子,米線一類的之外就是一份份的賣炒菜,差不多一份葷菜十幾塊,一份素菜近十塊的樣子,這就導致一個問題,一般男生花了幾十塊錢也就只能吃到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緩存的原理,把主食和湯粥分佈式的放在離同事們就餐的餐桌附近,這樣可以讓就餐的同事們最近範圍就可以盛到主食和湯粥,表面上看對營收沒提升,但實際上一是大家打飯近了,就餐體驗好了,二是大家打飯加飯方便了,就餐的時間就會降低,從而提升餐桌的利用率。保證下一個打到飯的同事能快速找到座位,體驗同樣也會提升。這裏我就不畫圖了,相信大家都能明白。

三、後記

華哥整體聽完我的優化方案後低頭陷入了沉思,許久之後他抬起頭看着我,眼神有些許迷離,我頓時有點緊張,以為他要系統點評一下我的方案,沒想到華哥開口問我的是,現在幾點了,我才意識到華哥剛才是喝多了低頭睡着了。

user avatar _5efd3fd7ee4bc 頭像 joyerli 頭像 shishangdexiaomaju 頭像
3 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.