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 MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...