前言:
本文介紹了餓了麼交付中心由python語言棧轉換到java語言棧大體過程,一來是對前段時間的工做作下總結,另外也是想經過這次總結爲其餘應用服務轉型提供些借鑑。寫的很差,歡迎板磚。java
餓了麼併入阿里集團,爲了能高效與集團內部系統協同對接,同時方便利用集團優點技術資源,更好的融入阿里集團技術生態圈,餓了麼交易中臺在上半年啓動了交易領域的四大應用語言棧轉型項目,爲阿里集團本地生活服務平臺打好技術平臺基礎作準備。另外,隨着業務量的激增,餓了麼平臺支持的品類不只僅是最初的外賣單品,整個交易中臺也須要一次相對大的重構來快速應對複雜多變的業務需求。而本文中的交付中心便是餓了麼交易領域四大應用之一。python
在開展相關工做以前,首先必須得清楚咱們是要將一個系統從什麼樣變成什麼樣,新的系統相較老的系統在哪些方面作的更好,同時必須保證新老系統的無縫切換,作到業務無感不影響交易系統的穩定性。數據庫
外賣訂單的業務特色是重交易,c端用戶從下單選餐到騎手完成餐品交付過程,目前大部分都能在半小時左右完成,對即時配送實時性要求較高。整個訂單交易過程大體劃分爲:1.添加購物車確認訂單,2.訂單生成及訂單支付,3.接單及訂單交付,4.可能的售後退單。而要更好的服務用戶,對四個系統穩定的協同能力提出很高的要求。api
如前文所述,咱們知道履約環節對交易訂單的價值是什麼,便是將外賣訂單對應的餐品交付到用戶手中,技術層面上來說,交付對交易訂單屏蔽了一切其餘履約細節,使訂單更專一訂單領域業務。緩存
接下來,咱們再進一步詳細的剖析下轉型前交付系統所承載的功能。
架構
如上圖所示,原交付履約領域中包含了三個較大板塊:併發
能夠看出原系統所承載功能並不是真正聚焦在訂單交付過程。怎麼辦?轉型重構是個契機。商戶訂單迴歸到訂單,金額計算下沉至結算,這兩部分的相關轉型重構這裏再也不贅述,相關部分也已由兄弟團隊完成。其實到這裏交付履約應該關注的已經很明顯:把外賣訂單給運力線,使其完成交付履約。框架
基於剛纔提取後的交付履約核心領域,咱們對主要的場景用例進行了詳細的梳理。以下圖所示,能夠看到:dom
參與交付過程的主要角色有四個:異步
交付提供的主要支撐能力有:
系統核心用例分析以下圖所示:
更詳細的系統用例梳理或系統上下游交互時序這裏再也不一一列舉,須要說明一點,當大流量系統轉型遇到重構,要想走的夠遠夠穩,前期的仔細調研工做及功能對齊過程很是重要。特別是生產環境已經跑了好幾年核心功能系統,實際業務狀況錯綜複雜。例如要轉型重構系統接口能力,接口含義,場景必須都要詳細掌握。
至此,咱們的目標已經很明確:1.語言棧轉型,2.過程當中要將不屬於交付的東西從原系統中分離出去,使得交付領域更乾淨。結合交付將來可能的發展方向,其中交付能力可複用的,履約運力線可擴展的。這對整個交付可快速迭代對接提出了更高要求。另外,咱們也在領域建模設計思想指導下作了些實踐嘗試,因而有了如下框架結構。
轉型是把python方言轉換到java方言,交付系統核心能力不會有變化。能力的複用是經過接口維度的抽象聚合產生,履約運力線能力可擴展經過利用業務框架擴展點特性知足。拆分後的業務框架應以下圖所示:
業務框架結合當前餓場基礎組件支持咱們不難給出如下系統內部模塊劃分:
簡單對各組成模塊作簡要說明:
到此,咱們能夠按照設計與既定的計劃擼代碼了。
嗯,代碼擼完了測完了,從調研到開發完成歷時兩個半月,代碼倉庫總行數約4.7w行,提交1000次左右,完成63個接口+16個消息消費入口轉型遷移,共計測出117+bug,期間有喜有憂,奮戰兩點可能是常態。職業生涯中濃重的一筆。此時尤記起與超哥@鄒超週末代理聯調於北14樓小黑屋之畔,和明龍@張明龍並肩做戰對接服務接口,還有曉波@俞曉波凌晨一同壓測觀察總結問題次日分析反饋提高優化,固然還有傑哥@湯良傑的用例設計全面不失細節、對bug經常究其根本,對代碼review邏輯覈對一絲不苟明察秋毫。凡此種種,歷歷在目。一塊兒走來,真心感謝。
------ 情不自禁的感概下 ≧◇≦
代碼擼完測完才作好轉型工做的第一步,將流量穩步平滑過渡到新的服務中,作到上下游無感是轉型過程當中面臨的另外一大挑戰。
說到這裏,要達到系統的語言轉型先後的平穩過渡實際上是在說轉型先後對咱們系統的用戶SLA(Service Level Agreement)提供一致性的保證。這裏先簡單聊聊系統服務的SLA。
服務可用性級別 | 服務正常運行時間百分比 | 年宕機時間 | 日宕機時間 |
---|---|---|---|
1 | 90% | 36.5day | 2.4 hour |
2 | 99% | 3.65day | 14 min |
3 | 99.9% | 8.76day | 86sec |
4 | 99.99% | 52.6min | 8.6sec |
5 | 99.999% | 5.25min | 0.86sec |
6 | 99.9999% | 31.5sec | 8.6msec |
上表格是業界服務高可用的幾個級別的衡量標準,例如:服務可用性是3個9時,整年宕機時長約爲8.76天的統計機率。另外,咱們須要明確的是不一樣的系統,不一樣的場景以及不一樣的用戶規模對系統可用性要求是不同的。如:某些業務的支付鏈路場景可能tps不是很高,可是做爲交易的核型鏈路必須得保證高級別的可用性。
怎麼保證或者提高系統服務的SLA呢?在明確咱們目標後,接下來就是拆解目標量化目標。
you cant measure it,you cant fix it and improve it.
通常來講,影響系統服務可用性有兩個重要因子:
因此大體能夠簡單概括爲這樣的一個函數關係:
可能沒法給到一個精確的數學描述,可是能夠作定性的分析:恢復時長因子與系統可用度成正相關,故障間隔因子與系統可用度成逆相關。也即:_問題出現時恢復時長要儘量的短,儘量下降故障頻率以增大故障間隔。
基於以上理論,咱們在作系統平穩過渡無縫切換時,不管資源使用,業務內部邏輯實現及灰度方案,咱們都須要着眼於這兩個方面。接下來咱們將從這兩個點出發分析轉型過程存在的挑戰及咱們的應對方式。
要作到恢復時長儘量的短,首先咱們須要保證在前期出現問題時流量切換過程當中流量規模儘量的小,即須要一個相對的合理的灰度梯度方案。其次當問題出現後我門須要能當即回切到原系統,不至於反應過慢致使大量增量問題產生,即須要一個響應高效的開關回滾方案。因爲轉型過程當中涉及的接口和消息消費入口較多,另外咱們還須要考慮到後期問題排障和快速定位的可能耗時。
因此咱們採用了以下的老系統服務代理方案:
如上圖所示,訂單系統建立訂單時根據既定的灰度計劃讀取配置給訂單打標,灰度計劃分爲前期分標品,門店維度驗證,後期按城市訂單分佈維度配置。若新系統服務出現問題可一鍵切掉灰度流量,止血增量問題。接着,原交付老服務識別標記作代理轉發,訂單不存在遷移標記則原流程操做處理,不然轉發到新交付中心新服務操做處理,相應的消息監聽處理一樣也是參照訂單標記,這樣保證了同一個訂單的交付過程能在一個應用中完成,有利於後期處理流量上來後的快速問題定位。
另外,咱們的接口灰度過程是寫與查分離的,整個遷移過程大體分爲三個階段,以下圖所示:
平均故障間隔是一個後驗時長數據,要作到間隔時長儘量的長,平常裏就需作好發佈控制,風險巡檢及持續監控等工做。
1.發佈控制
轉型期間新系統服務必須遵循發佈sop,餓場發佈sop已經造成共識,咱們只需嚴格遵照,這裏再也不贅述。
2.風險巡檢
3.多層次持續監控
轉型過程當中咱們實際上同時作了數據模型優化遷移,對外爲了保證新老系統行爲屬性的一致性,咱們還面臨如下幾個挑戰:
一致性的保證,別無他法,只能經過比對來作。但在作比對的時候咱們還須要考慮到比對自己只是咱們驗證遷移系統正確性及穩定性的一部分屬旁路,並不是生產環境的必須功能。即咱們得考慮這部分功能對現有系統可能形成的壓力。這部分壓力應該是隨着系統驗證完畢是可開關的,壓力大小應隨系統的表現可隨時調節。不至於由於驗證拖垮了生產應用。因此咱們對比對的基本要求是:能一鍵開關,可監控可追溯。除了這些共性,具體還應作到如下幾點:
針對底層數據比對:
具體實施方案以下:
針對應用層數據比對:
具體實施方案以下:
不管數據層面仍是接口層面出現比對不一致,應馬上去分析是什麼緣由致使不一致。解決根因逐步降噪,只至比對差別在咱們認爲可接受的範圍內。
針對上下游數據最終一致性:
通過數據準實時比對,接口實時異步比對,其實基本能夠確認新老系統能力行爲屬性對等性。然而穩定大於一切,要百分百肯定還須要t+1數據覈驗。即從全局數據角度看新老系統轉換的影響。這裏以主幹鏈路呼單多日成功率爲例作簡要說明。以下圖所示,多日乎單成功率基本在99.9977%左右,能夠認爲新老系統代理切換交付成功率基本表現穩定。
截止此文攥寫時間,餓了麼交付中心已經完成了整個系統的語言轉換,流量也已經100%切換代理到新系統,處於流量切換的第三階段。結合平常系統維護與需求迭代實踐,咱們仍須要再如下幾個方面進行更深刻的思考:
凡此以上,服務系統轉型遷移歸結於開發者理解與認知,項目的穩定實施歸結於開發者套路方法運用。能夠簡單進一步提煉爲如下方法論:
關於認知提高的幾個小點:
做者信息:李傑,花名項庭,當前主要負責餓了麼交付領域系統。
本文爲雲棲社區原創內容,未經容許不得轉載。