promise時效架構升級方案的實施及落地

来源:https://www.cnblogs.com/jingdongkeji/archive/2023/11/16/17835551.html
-Advertisement-
Play Games

重構有利於項目的健壯和精簡,平時要養成重構的好習慣,“小步快走”,儘量避免留著統一重構的思想,積累很多技術債後重構精力、時間成本很大,風險也會大很多 ...


一、項目背景

為什麼需要架構升級

  • promise時效包含兩個子系統:內核時效計算系統(系統核心是時效計算)和組件化時效系統(系統核心是複雜業務處理以及多種時效業務聚合,承接結算下單黃金流程流量),後者依賴前者,分別由兩組技術團隊支持;因為有些業務的滲透造成兩個系統的邊界越來越不清晰;有些需求從PRD評審到項目上線,需要兩組研發全程參與,耗費大量人力;
  • promise時效計算業務邏輯經過多年的沉澱越來越複雜,時效計算系統中有很多業務邏輯,導致計算內核也需要跟隨需求頻繁更新;
  • 時效計算分為預約和非預約,下單前和下單後,結算頁時效和商詳頁時效。有共性也存在差異,導致共用一部分內核計算的同時存在大量冗餘重覆代碼,需要同時維護和存儲兩份時效計算的緩存數據。
  • 多種業務從內核系統中提供專用介面,導致系統嚴重腐化。
  • 存在部分未採用RPC方式的依賴,導致jar包依賴和時效計算的切量開關需要配置在組件化時效系統中,影響開發和聯調效率。

綜上,決定這次技術驅動的重構,需要架構升級解決系統中存在的問題。

重構目標

業務邊界更清晰

重構之後的需求邊界從產品側就能夠確定,如果新增倉配時效計算規則需要修改或新增內核計算,其他業務的需求基本組件化時效中修改即可;

業務邏輯更聚合

組件化中整合業務邏輯;

內核計算邏輯更純凈

一套時效計算緩存,節省一半硬體資源費用;

增加系統復用性,一套計算模式同時支持預約和非預約兩種模式,支持結算和商詳,下單前和下單後的場景;維護一套內核計算邏輯代碼,與具體業務分離,節省更多人力資源;

二、方案設計

內核計算業務梳理

現有業務介面:

  • 標準達日曆:考慮控單,產能,大宗禁止 標準達日曆
  • 京準達日曆:考慮控單,產能,大宗禁止 京準達日曆
  • 無人車日曆:無人車日曆 倉自提/無人車日曆
  • 倉自提日曆:倉自提日曆,不走干支線 倉自提/無人車日曆
  • 自提日曆:獲取自提點四級地址,考慮控單,產能,大宗禁止 標準達日曆
  • Vxp日曆:考慮控單,節假日,大宗禁止,不考慮產能,固定最大天數和可選天數 標準日曆
  • 7Fresh日曆:標準達日曆計算完成後根據門店波次替換日曆波次 標準達日曆
  • 全球購報稅日曆:加上全球購報稅備貨buffer後走標準達日曆計算 標準達日曆
  • B2B日曆:B2B日曆計算
  • 奪寶島日曆:奪寶島日曆計算

根據業務特點,將原來的8種業務時效計算介面聚合為3個核心通用計算介面,消除了5種業務的特殊處理介面。重新定義設計新的內核計算介面:京準達時效、標準時效、倉自提時效。減少了大量重覆代碼,避免改一個需求就要改好多相同的地方,便於統一管理。

新core系統三個核心介面方法可以為多個業務系統提供服務

系統重構相關業務如下圖所示,

主要變更點:

  • core介面聚合,組件化系統適配,補充處理前置信息;
  • 重構之前控單介面的調用和產能邏輯分散在組件化時效和base系統中,重構後產能提供新介面,控單和產能邏輯從core系統剝離,集中到組件化時效系統中;
  • 大宗商品、二級倉、全球購清關、VXP節假日等業務邏輯上浮到組件化系統,減少了系統間報文大小和介面複雜度;

系統重構業務

三、項目實施

組件化業務梳理

  • 考慮產能
  • 考慮控單
  • 考慮走干支線
  • 判斷是否大宗
  • 新增全球購清關時長加buffer
  • 新增產能白名單
  • 新增產能白名單打標
  • 新增自提波次格式轉換
  • 新增二級倉出參信息整合
  • core新介面轉單據類型
  • 節能補貼增加預設buffer
  • 增7鮮門店波次轉換
  • 新增全球購多倉屏蔽邏輯

組件化時效中對新介面進行適配,可用切量開關進行控制

四、穩定性保障

怎樣保證系統重構的安全性和準確性,重構前後一致性驗證上線前主要有兩種方式:單測覆蓋和流量回放驗證;上線後通過多維度切量開關進行控制,保障系統的穩定性。

上線前

  • 單測場景覆蓋

1700+個測試用例,覆蓋大部分單一業務場景和部分組合業務場景。

  • 流量回放驗證

通過實時引流線上流量,回放到重構後的系統中。流量回放過程中發現差異,分析具體原因,發現多個重構測試用例未覆蓋到的複雜場景問題。

eg.全球購商品滿足城配轉普通時效走大宗時效的場景:正常邏輯是①全球購商品命中了城配邏輯;②全球購不支持城配時效,需要轉普通時效;③轉成普通時效後又命中大宗業務場景。重構時從①走到了③,城配時效和大宗時效是互斥的,所以無法轉換成大宗時效,調整轉換邏輯後導致和重構前時效不一致,這種場景負責涉及業務配置很多,很難通過測試用例覆蓋,流量回放驗證是很好的驗證方案。

  • 流量回放自定義對比差異

由於系統架構調整以及新介面的設計和老架構存在差異,導致採購、全球購、控單等業務場景下返回的起始日曆日期不一致,實際可用日曆和波次是一致的,所以這種是預期內的差異,導致流量回放時diff率較高,頁面配置的忽略欄位無法滿足我們的需求;

首次採用自定義腳本進行差異對比,自定義實現排序和忽略項設置,將不影響時效的差異對象忽略掉,減少diff干擾。

  • 業務方案確認

對未通過測試用、流量回放差異,研發測試分別列出清單,研發、測試、產品組會進行溝通,對系統現狀和業務影響範圍進行評審,確定最終處理方案。

測試中發現的問題驗證修複後,確認達到業務要求和上線標準,才可以灰度上線。

上線後

灰度發佈時,只接入一小部分流量,並及時跟蹤和分析線上的 log 與監控告警,並關註用戶反饋一有問題及時解決。當新系統趨於穩定時,逐漸加大灰度發佈的範圍和接入的流量,同時繼續跟蹤線上 log 與監控告警。

  • 白名單驗證

上線後用白名單用戶進行驗證。

  • 流量切換控制

系統上線後,支持用戶PIN的百分比進行切量,灰度驗證實現平穩過渡。

  • 組件切換開關

新老邏輯組件可以一鍵切換,如發現問題可快速切回原邏輯,快速止損,保證線上系統安全;

五、項目價值

系統優化

  • 按項目預期實現了全新純凈的時效內核計算介面,內核系統具有更高的復用性;
  • 組件化系統中重新組織部分邏輯,增加上浮的業務邏輯。系統邏輯更聚合,提升易讀性、減小了系統維護成本;
  • 降低上線風險,重塑業務邊界後,交互系統邏輯更集中,減少了相互依賴配置,更利於把控風險;
  • 重構修複測試用例和引流驗證時,發現並修複多個線上BUG,保障並提高了系統的穩定性;

◦ 測試用例發現5個BUG,修複遺漏邊緣業務邏輯和處理邏輯錯誤等問題;

◦ 流量回放中發現7個BUG,修複530標位、京準達時效類型等線上bug;

  • 修正40+個測試用例;

遇到的困難

系統重構總能留下比較深刻的印象,不僅會碰到技術的挑戰,需要思考用什麼方案更合理;也會碰到難以理清的業務邏輯,需要將產品、研發、測試搖到一起追思憶往;還會發現歷史的“bug”,讓人糾結要不要“更正”;都很耗費發量。

1、流量回放階段,由於出參數據填充方式變化,導致無法比較,通過自定義腳本的方式解決。

2、自提時效多倉場景新架構無法支持,協同產品、業務優化原有多倉場景的處理方式,既解決問題又優化了線上處理邏輯。

項目總結

重構有利於項目的健壯和精簡,平時要養成重構的好習慣,“小步快走”,儘量避免留著統一重構的思想,積累很多技術債後重構精力、時間成本很大,風險也會大很多。如果重構任務艱巨,需要提前做好迭代計劃,重構方案設計之初就要考慮如何分階段實施,小步快走層層分離的策略就相當於搭建施工現場的腳手架,是一種把風險控制在可接受範圍的有效手段。更多關註“明天價值”,當發現好的數據結構、好的思想的時候,甚至一個變數名或方法名,把以前寫的代碼重寫一下;

何時進行重構最好遵循“三次法則”,如果一件事需要做一兩次,可以不著急重構;但是如果需要重覆三次甚至以上的話,就該考慮著手去重構了,保持系統的健康狀態。

公司業務在快速發展中,系統重構期間,需繼續保持業務需求的迭代速度,可以適當增加人員。

系統重構前需要對業務足夠熟悉(包括邊緣業務),重構時可能會遇到看著重構代碼一樣,實際代碼的執行順序影響業務的前後依賴或優先順序,最後影響結果的輸出,在複雜的業務處理流程中很難發現問題。

上線後跟蹤系統運行實際性能變動、資源消耗、穩定性。重構中發現了系統中存在相似的業務處理邏輯、城配相關的邏輯過於複雜等問題,下一步與產品業務溝通是否可以進行精簡,重構不是終點,更像是起點。

作者:京東物流 崔海君

來源:京東雲開發者社區 自猿其說 Tech 轉載請註明來源


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 本章將介紹如何在 HarmonyOS 上進行實際項目開發。我們將從項目需求分析開始,逐步完成項目的設計、開發、測試和上線過程。 ...
  • 目錄準備界面:view控制項LayoutCreator事件監聽OnClickListener轉跳頁面IntentIntent傳遞數據Toast和AlertDialogGson使用OKhttp3的基本使用post方法get方法輕量級存儲SharedPreferenceListView基本使用1、Simp ...
  • 作為一名全棧工程師,在日常的工作中,可能更側重於後端開發,如:C#,Java,SQL ,Python等,對前端的知識則不太精通。在一些比較完善的公司或者項目中,一般會搭配前端工程師,UI工程師等,來彌補後端開發的一些前端經驗技能上的不足。但並非所有的項目都會有專職前端工程師,在一些小型項目或者初創公... ...
  • 這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 在我們寫項目代碼時,應該更加專註於業務邏輯的實現,而把定式代碼交給js庫或工程化自動處理,而我想說的是,請求邏輯其實也是可以繼續簡化的。 你可能會說,用axios或fetch api就夠了啊,哪有什麼請求邏輯,那可能是你還沒有意識到這個問 ...
  • 需求:客戶的電腦都只能訪問內,伺服器可以訪問外網,客戶電腦使用的項目中用到了高德webapi2.0。10.200.31.45:32100是我們的web伺服器。 網上基本上都是對高德webapi1.4的配置方式,而web2.0有一些差別。 1.前端修改高德地圖的js應用 如果是index.html引入 ...
  • 最近做的幾個項目經常遇到這樣的需求,要在表格上增加一個自定義表格欄位設置的功能。就是用戶可以自己控制那些列需要展示。在幾個項目里都實現了一遍,每個項目的需求又都有點兒不一樣,迭代了很多版,所以抽時間把這個功能封裝了個組件:@silverage/table-custom,將這些差別都集成了進去,方便今... ...
  • 大綱 本文內容更多的是講講使用 vuex 的一些心得想法,所以大概會講述下麵這些點: Q1:我為什麼會想使用 vuex 來管理數據狀態交互? Q2:使用 vuex 框架有哪些缺點或者說副作用? Q3:我是如何在項目里使用 vuex 的? 初識 vuex 對於 vuex,有人喜歡,有人反感 喜歡的人覺 ...
  • 微服務是一種軟體架構策略,將應用程式分解為一組解耦的、自治的服務。採用微服務架構將改善整體性能和可擴展性,本文將概述微服務設計和實施的基本考慮因素。 ...
一周排行
    -Advertisement-
    Play Games
  • 前言 微服務架構已經成為搭建高效、可擴展系統的關鍵技術之一,然而,現有許多微服務框架往往過於複雜,使得我們普通開發者難以快速上手並體驗到微服務帶了的便利。為瞭解決這一問題,於是作者精心打造了一款最接地氣的 .NET 微服務框架,幫助我們輕鬆構建和管理微服務應用。 本框架不僅支持 Consul 服務註 ...
  • 先看一下效果吧: 如果不會寫動畫或者懶得寫動畫,就直接交給Blend來做吧; 其實Blend操作起來很簡單,有點類似於在操作PS,我們只需要設置關鍵幀,滑鼠點來點去就可以了,Blend會自動幫我們生成我們想要的動畫效果. 第一步:要創建一個空的WPF項目 第二步:右鍵我們的項目,在最下方有一個,在B ...
  • Prism:框架介紹與安裝 什麼是Prism? Prism是一個用於在 WPF、Xamarin Form、Uno 平臺和 WinUI 中構建鬆散耦合、可維護和可測試的 XAML 應用程式框架 Github https://github.com/PrismLibrary/Prism NuGet htt ...
  • 在WPF中,屏幕上的所有內容,都是通過畫筆(Brush)畫上去的。如按鈕的背景色,邊框,文本框的前景和形狀填充。藉助畫筆,可以繪製頁面上的所有UI對象。不同畫筆具有不同類型的輸出( 如:某些畫筆使用純色繪製區域,其他畫筆使用漸變、圖案、圖像或繪圖)。 ...
  • 前言 嗨,大家好!推薦一個基於 .NET 8 的高併發微服務電商系統,涵蓋了商品、訂單、會員、服務、財務等50多種實用功能。 項目不僅使用了 .NET 8 的最新特性,還集成了AutoFac、DotLiquid、HangFire、Nlog、Jwt、LayUIAdmin、SqlSugar、MySQL、 ...
  • 本文主要介紹攝像頭(相機)如何採集數據,用於類似攝像頭本地顯示軟體,以及流媒體數據傳輸場景如傳屏、視訊會議等。 攝像頭採集有多種方案,如AForge.NET、WPFMediaKit、OpenCvSharp、EmguCv、DirectShow.NET、MediaCaptre(UWP),網上一些文章以及 ...
  • 前言 Seal-Report 是一款.NET 開源報表工具,擁有 1.4K Star。它提供了一個完整的框架,使用 C# 編寫,最新的版本採用的是 .NET 8.0 。 它能夠高效地從各種資料庫或 NoSQL 數據源生成日常報表,並支持執行複雜的報表任務。 其簡單易用的安裝過程和直觀的設計界面,我們 ...
  • 背景需求: 系統需要對接到XXX官方的API,但因此官方對接以及管理都十分嚴格。而本人部門的系統中包含諸多子系統,系統間為了穩定,程式間多數固定Token+特殊驗證進行調用,且後期還要提供給其他兄弟部門系統共同調用。 原則上:每套系統都必須單獨接入到官方,但官方的接入複雜,還要官方指定機構認證的證書 ...
  • 本文介紹下電腦設備關機的情況下如何通過網路喚醒設備,之前電源S狀態 電腦Power電源狀態- 唐宋元明清2188 - 博客園 (cnblogs.com) 有介紹過遠程喚醒設備,後面這倆天瞭解多了點所以單獨加個隨筆 設備關機的情況下,使用網路喚醒的前提條件: 1. 被喚醒設備需要支持這WakeOnL ...
  • 前言 大家好,推薦一個.NET 8.0 為核心,結合前端 Vue 框架,實現了前後端完全分離的設計理念。它不僅提供了強大的基礎功能支持,如許可權管理、代碼生成器等,還通過採用主流技術和最佳實踐,顯著降低了開發難度,加快了項目交付速度。 如果你需要一個高效的開發解決方案,本框架能幫助大家輕鬆應對挑戰,實 ...