為了30分鐘配送,盒馬工程師都有哪些“神操作”?
阿里妹導讀:提到盒馬鮮生,除了新鮮的大龍蝦以外,大家印象最深的就是快速配送:門店附近3公里範圍內,30分鐘送貨上門。
盒馬是基於規模化和業務複雜度兩個交織,從IT到DT,從原產地到消費者而形成的端到端的平臺,而盒馬配送更是整合IOT、智慧化、自動化等到線下作業,同時受不可抗力因素雨雪冰霧、道路交通、小區設施等讓配送系統的穩定性更加雪上加霜,如何保障線下配送作業的穩定性,讓騎手快樂,更讓使用者開心是盒馬配送永恆的話題。
三大規範
整個盒馬技術部對線上/線下作業生產之關注,程式碼質量之高、故障處理之嚴,讓我們工程師在反覆反覆地肯定自己的同時又不斷地否定自己,在開發中設計重構系統,在生產之中檢驗系統。經過線上/線下冰與火的歷練,我們淬鍊出了一套穩定性的方法論,概括起來就12個字:研發規範、架構規範、穩定性規範。
無規矩,無以成方圓
首先是研發規範,且看下圖:
這個圖管它叫做7層漏斗模型(努力畫出漏斗,畫圖功夫不行,淺色的箭頭表示漏斗),7層是指PRD評審、技術方案評審、TC評審、編碼、測試&程式碼Review、灰度釋出、運維。為什麼是漏斗模型呢?因為我們通過這7層經過層層篩選,將阻礙線下流程的重大故障全部在這7層兜住。
PRD評審:我們有個需求池,所有的需求都先扔到這個池子裡面,每兩週有個運營雙週會,從中篩選出優先順序高、緊急程度高的需求開始進行PRD評審(倒排專案除外),所有的PRD評審都有PD組織,從專案或者需求的價值認識上達成一致,在評審的過程中研發同學從PRD中尋找名詞進行領域建模和抽象。整個需求和專案需要識別到技術風險,遵循“不被別人搞死、不搞死別人”的原則,識別核心鏈路和非核心鏈路;測試同學從中識別風險點和測試功能點,為後面TC評審做好準備。
技術方案評審:PM組織研發、測試和PD總共參與,研發同學按照事先分配好的研發模組進行技術串講,同時和PD、甚至電話業務同學共同達成產品兜底方案和業務兜底方案。人都會犯錯,何況是人寫出來的程式碼,我們要擁抱bug,但更要識別到潛在的風險進行兜底。
TC評審:一般在技術評審完成後的兩天內會進行TC評審,主要功能的覆蓋點、技術方案潛在的坑、非功能角度的業務降級方案、效能的QPS\RT、介面的可測性的評估、測試環境、測試資料等,最後給出可靠的上線時間。
編碼:首先遵循集團的編碼規則,然後就是防禦性程式設計,業務系統可能80%的程式碼都在考慮異常情況下如何保證高可用。系統異常、業務異常的處理,上線時門店灰度方案(一個門店出問題,不影響整個盒馬門店),快取機制、柔性可用、重試機制、事務處理、串並行、打日誌等等。
測試&程式碼Review:首先研發完成自測並冒煙通過,正式提測,當然在編碼的過程中也會進行程式碼Review,那時的程式碼Review管它叫線上Review,通過Aone的功能提交給相關同學進行Review;整個測試結束後上線前我們會聚集到一起進行程式碼圍觀Review,這個階段也會完成系統依賴順序、釋出順序、回滾順序,每個人的位置。
灰度釋出:首先我們嚴格遵守盒馬研發紅線,按照發布視窗進行釋出,同時為了將風險降到最低,針對不同的業務做不同的釋出時間點,比如O2O場景下午2點準時釋出,B2C場景晚上8點半準時點火;針對不同的門店進行灰度,釋出完成後就立馬通過SLS檢視原始錯誤日誌,A3檢視錯誤統計日誌,EagleEye檢視QPS/RT,CloudDBA檢視DB效能/慢SQL等全面盯屏30分鐘以上。一般我們覺得風險比較大的,在釋出時會只發2臺機器,第二天觀察沒有任何問題再全部上線,如果有問題就直接上去Kill掉這兩臺機器。
運維:每次釋出後第二天早起盯屏是非常關鍵,尤其是配送涉及不同運力商、運力型別等作業的校驗方式不同,在早上運力型別豐富是最容易出問題,也最容易發現問題。一旦有問題,誰先第一個發現先問題就會立馬在群裡釘釘電話所有人,若是跨團隊的會單獨拉小群電話所有人,對於問題的定位我們設定專門的同學,有人看SLS,有人看EagleEye,有人看A3,有人看Xflush,有人看CloudDBA,有人對外發聲安撫騎手,一個人統一指揮,大家分工明確,整個問題處理起來就像一個人。
不把雞蛋放在一個籃子
盒馬配送目前有50+系統,其中核心應用有20+,那麼這麼多系統如何既保穩定又能協作?且看下圖:
專案化:盒馬配送從剛開始按照專案維度構建整個系統,能夠滿足盒馬使用者的個性化需求,這種在人少的情況下開發起來很快,也能快速的迭代。
產品化:隨著業務需求越來越多,這種開發方式越來越拖慢整個專案節奏,尤其是需求的靈活多變,這個時候產品化的方式隨之而來,我們在去年5月份的引入了NBF的規則中心、各種Setup,將運營邏輯和業務邏輯區別開來等各種配置化,快速支援需求的變化。
服務化:去年8月份的時候和點我達、鄰趣、蜂鳥等三方進行對接,對接的過程比較痛苦,我們發現業務邏輯主要是在盒馬場景下,三方的場景需要做一些定製,這個時候我們開始考慮整個線下作業不變業務規則和基於場景的業務規則,將不變業務規則下沉作為我們的後臺,基於場景的業務規則放到我們的中臺,形成後臺解釋業務概念、業務狀態和業務規則,中臺做統一許可權校驗、場景化的業務邏輯、資料閘道器、整個降級限流可以上浮到中臺來,完成對各運力商的流控,慢慢孵化出上面的架構規範。這一過程比較痛苦,我們既要追趕業務,又把34個核心的L0服務梳理業務邏輯、介面引數的合理性、外部依賴等重新升級一遍,新老服務平滑遷移對業務無感,最後註冊到NBF上,通過NBF連結起所需的各域能力去表達業務。
數字化:最底下一層是我們的用工管理平臺,新零售從企業角度看有兩個核心層面,其一是技術層面“人貨場”的數字化;其二是零售層面的“人貨場”的變革或者革命;用技術驅動零售變革,讓我們真正能看到整個線下作業流程的好與壞,哪些門店好,哪些門店差,原因到底在哪裡,如何去優化提供技術依據和支撐,整個資料模型如下圖:
紙上得來終覺淺
任何理論、架構都要不斷接受實踐的檢驗,在錯誤中學習,在錯誤中成長,提出了一套適合線下配送的7路23招打法,如下圖:
第一路:核心和非核心隔離
首先我們從應用維度進行核心和非核心隔離,核心服務和非核心服務隔離,從資料庫層面我們做了核心庫和非核心庫隔離,讀寫分離、充分發揮各儲存層的優勢,比如核心作業場景我們採用Mysql,實時聚合分析場景我們採用ADS,非核心多維度組合查詢場景我們引入OpenSearch、和離線場景的ODPS,這樣既起到分流的作用,又保護了核心作業場景。如此架構升級,可以讓我們的上嘉同學進來在一些非核心場景上獨擋一面,充分發揮他們的潛力。
系統互動上我們採用基於Request/Response模式的HSF水平呼叫;另外一種基於Event-driven模式的訊息垂直呼叫。
對核心服務的依賴上,我們本著不信任任何外部服務的原則,即使外部服務出問題,我們依然能夠繼續作業,形成如下圖的呼叫方式:
鏈路開銷大且網路抖動很容易引起問題,我們會將其做成一個“航母級”的服務來呼叫,如下呼叫:
舉個例子:配送人貨匹配生成笛卡爾積後類似map-reduce進行分散式計算,通過鷹眼鏈路觀察發現耗時主要在map到reduce的網路耗時,不在於計算耗時,我們將將人貨匹配生成矩陣,平衡網路開銷和分散式計算,最後將108次呼叫變為9次,效能基本提升12倍,如下矩陣:
第二路:及時發現問題是穩定的一半
服務級別-冪等、引數校驗、熔斷、還是靜態和動態控制超時時間、重試次數來保障服務級別的高可用;
系統級別-流量排程、研發紅線、程式碼Reivew文化、重大發布集體上光明頂、流量排程、A3\EagleEye\SLS\Xflush等的QPS\RT同比環比的服務監控還是底層的機器效能監控都能保證在第一時間發現問題。重大發布集體上光明頂是我們的一個文化,記得在雙12前兩週我們對整個系統架構進行了一次升級,涉及13個系統又在大促前頂著壓力釋出上線,最終在雙12期間系統整體平穩,較雙11各項指標毛刺減少,特別是雙12哪幾天的雨雪天氣在站內批次積壓嚴重的情況下,我們的人貨追加服務較雙11的QPS增加近一倍,但我們的RT卻降低了50%。
其它招,比如我們在過年期間每天的專人進行核心系統的例行檢查,確保系統正常執行;在穩定性知識方面,我們內外結合進行分享,同時將別的team的故障都當做自己的故障來分析原因和查詢我們系統的不足。
第三路:故障預防
在系統複雜和業務需求不斷導致程式碼腐化,我們定時對整個系統進行重構,將整個重構方案大家達成一致;在今年系統的混部環境對我們也是一個挑戰,所以我們引入了超時和重試機制,特別是做到了執行期修改超時時間,防止雪崩,每一個新功能上線時都會做故障注入和故障演練,識別潛在風險。
第四路:故障緩解
我們機器留有一些buffer以防大促、執行緒池滿等緊急擴容情況下使用,同時對高QPS有降級預案以防異常情況緊急止血。還是前面提到的業務系統一定要有產品和業務兜底方案,比如我們在和蜂鳥對接時當蜂鳥的系統如果出現問題時,我們服務端針對此種情況做了防禦性程式設計,開啟開關讓蜂鳥騎手用飛魚app進行作業,減輕對使用者的影響面。在穩定上,我們不但要自己贏,也要讓合作伙伴贏。
第五路:快速恢復
回滾是系統釋出後出現異常最有效的止血方案,對於弱依賴我們通過柔性可用性讓它跳過不阻塞繼續往下走,當出現異常case時比如履約和配的狀態不一致我們通過阿波羅後臺進行一鍵修復,異常緊急訂正預案、Diamond命令下發等來快速恢復。
第六路:快速補償
我們的系統在設計的都是無狀態扁平化,不存在單點,機器擴容是應對某些異常情況的快速止血方案。
第七路:釋出治療
在上述路數招數都無法快速止血的情況下只能採用釋出治療,我們有一次突然機器Load飆高,收到報警後第一反應是機器問題,但又發現部分機器的執行緒池也快滿了,我們隨即開始擴容和機器重啟,一部分同學在快速擴容,一部分同學在不停的機器重啟,其它同學在迅速查詢問題的根本原因,最後通過DUMP發現是由於引用了一個Jar,而這個Jar包裡面使用了Java的正規表示式在解析一個特殊商品名稱的時候進入了死迴圈,找到原因後這種情況只能通過釋出解決,我們迅速達成一致緊急釋出解決,正是前面一部分同學的擴容和不停的重啟,從而避免了一場故障。
大海航行靠舵手
盒馬配送的穩定性靠的是業務方、產品、研發、測試、Web端、App端、RF端、GOC、上下游、演算法、IOT、NBF、盒馬安全生產、中介軟體、網路、氣象臺、雨雪冰霧、道路交通、紅綠燈、小區設施、騎手裝備等等各種因素,每一個組成部分都是至關重要。穩定性的探索我們還在路上,不斷追求極致。
本週三晚,阿里技術直播等你來!
3月20日(週三)晚19:30,我們們一起聊聊“AI與安全:數字時代下的機遇與挑戰!”,歡迎收看。
直播參與方式:
直接觀看:掃描上方圖片二維碼,或點選本文末尾的“閱讀原文”,在瀏覽器中(記住!一定要用瀏覽器開啟,手機或PC均可)開啟直播連結,收藏起來,定好鬧鐘,3月20日(週三)準時觀看。
釘釘群觀看:使用“釘釘”搜尋交流群號 21933455,加入AI與安全技術交流群,既可到時觀看直播,也可與嘉賓、行業同仁互動探討。
直播亮點:
本次直播,我們將重點介紹多模態融合、小樣本學習、領域遷移、視訊graph建模等前沿AI安全技術。究竟阿里如何通過這些技術提升整體風險防控能力?本週三晚,不見不散!
你可能還喜歡
點選下方圖片即可閱讀
相關文章
- 30分鐘講清楚深度神經網路神經網路
- 30分鐘SQL指南SQL
- 30分鐘入門MyBatisMyBatis
- 30分鐘精通React HooksReactHook
- 30分鐘泛型教程泛型
- 30分鐘閒置伺服器建站(gitlab為例)伺服器Gitlab
- 30分鐘快速瞭解webpackWeb
- 【譯】30 分鐘入門 TypescriptTypeScript
- 30分鐘理解GraphQL核心概念
- 30 分鐘 Qunit 入門教程
- 雲伺服器:301重定向都有哪些方法伺服器
- 30 分鐘快速入門 Docker 教程Docker
- 30 分鐘理解 CORB 是什麼ORB
- 30 分鐘學會 Flex 佈局Flex
- 30 分鐘 Java Lambda 入門教程Java
- 十分鐘掌握SQLite操作SQLite
- 如何用30分鐘快速優化家中Wi-Fi?阿里工程師有絕招優化阿里工程師
- 1 分鐘 Serverless 極速抽盲盒,自己部署自己抽!Server
- 當前深度神經網路模型壓縮和加速都有哪些方法?神經網路模型
- 30分鐘徹底弄懂flex佈局Flex
- [譯] 30 分鐘 Python 爬蟲教程Python爬蟲
- 30分鐘讓網站支援HTTPS網站HTTP
- 30 分鐘內瞭解 IEC 61850
- 為神馬說寫程式是很艱難的
- 窮追猛打,阿里二面問了我30分鐘從URL輸入到渲染...阿里
- 30分鐘讓你掌握Git的黑魔法Git
- 30分鐘搭建你的靜態網站網站
- 前置機器學習(三):30分鐘掌握常用NumPy用法機器學習
- 1 分鐘學會 30 種程式語言
- 30分鐘,讓你徹底明白Promise原理Promise
- 30分鐘Git命令入門到放棄Git
- 30分鐘編寫一個Flask應用Flask
- 正規表示式30分鐘入門教程
- 為了實現端點保護,可以執行哪些操作呢?
- Python庫都有哪些Python
- 七夕專屬限定:1 分鐘 Serverless 極速抽盲盒Server
- Linux基礎的開關機命令怎麼操作?都有哪些?Linux
- 30分鐘實現小程式語音識別