提到盒馬鮮生,除了新鮮的大龍蝦以外,大家印象最深的就是快速配送:門店附近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評審,主要功能的覆蓋點、技術方案潛在的坑、非功能角度的業務降級方案、性能的QPSRT、接口的可測性的評估、測試環境、測試數據等,最后給出可靠的上線時間。
編碼:首先遵循集團的編碼規則,然后就是防御性編程,業務系統可能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文化、重大發布集體上光明頂、流量調度、A3EagleEyeSLSXflush等的QPSRT同比環比的服務監控還是底層的機器性能監控都能保證在第一時間發現問題。
重大發布集體上光明頂是我們的一個文化,記得在雙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、盒馬安全生產、中間件、網絡、氣象臺、雨雪冰霧、道路交通、紅綠燈、小區設施、騎手裝備等等各種因素,每一個組成部分都是至關重要。穩定性的探索我們還在路上,不斷追求極致。
新時代鞋服物流與供應鏈面臨的變革和挑戰03月07日 20:38
點贊:這個雙11,物流大佬一起做了這件事11月22日 21:43
物流管理機構及政策分布概覽12月04日 14:10
盤點:2017中國零售業十大事件12月12日 13:57
2017年中國零售電商十大熱點事件點評12月28日 09:58