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
  • 當使用Autofac處理一個介面有多個實現的情況時,通常會使用鍵(key)進行區分或者通過IIndex索引註入,也可以通過IEnumerable集合獲取所有實例,以下是一個具體的例子,演示如何在Autofac中註冊多個實現,並通過構造函數註入獲取指定實現。 首先,確保你已經安裝了Autofac Nu ...
  • 本篇將分享Prometheus+Grafana的監控平臺搭建,並監控之前文章所搭建的主機&服務,分享日常使用的一些使用經驗本篇將配置常用服務的監控與面板配置:包括 MySQL,MongoDB,CLickHouse,Redis,RabbitMQ,Linux,Windows,Nginx,站點訪問監控,已... ...
  • 使用Aspirate可以將Aspire程式部署到Kubernetes 集群 工具安裝 dotnet tool install -g aspirate --prerelease 註意:Aspirate 正在開發中,該軟體包將作為預覽版進行版本控制,--prelease 選項將獲得最新的預覽版。 容器註 ...
  • 前言 本文要說的這種開發模式,這種模式並不是只有blazor支持,js中有一樣的方案next.js nuxt.js;blazor還有很多其它內容,本文近關註漸進式開發模式。 是的,前後端是主流,不過以下情況也許前後端分離並不是最好的選擇: 小公司,人員不多,利潤不高,創業階段能省則省 個人開發者,接 ...
  • 在.NET中,Microsoft.Extensions.Logging是一個靈活的日誌庫,它允許你將日誌信息記錄到各種不同的目標,包括資料庫。在這個示例中,我將詳細介紹如何使用Microsoft.Extensions.Logging將日誌保存到MySQL資料庫。我們將使用Entity Framewo ...
  • chatgpt介面開發筆記3: 語音識別介面 1.文本轉語音 1、瞭解介面參數 介面地址: POST https://api.openai.com/v1/audio/speech 下麵是介面文檔描述內容: 參數: { "model": "tts-1", "input": "你好,我是饒坤,我是ter ...
  • 前面兩篇文章主要是介紹瞭如何解決高併發情況下資源爭奪的問題。但是現實的應用場景中除了要解決資源爭奪問題,高併發的情況還需要解決更多問題,比如快速處理業務數據等, 本篇文章簡要羅列一下與之相關的更多技術細節。 1、非同步編程:使用async和await關鍵字進行非同步編程,這可以避免阻塞線程,提高程式的響 ...
  • 大家好,我是棧長。 Nacos 2.3.0 前幾天正式發佈了,新增了不少實用性的新功能,真是史上最強版本。 Nacos 2.3.0 還真是一個比較重要的大版本,因為它涉及了太多重大更新,今天棧長給大家來解讀下。 Nacos 先掃個盲: Nacos 一個用於構建雲原生應用的動態服務發現、配置管理和服務 ...
  • IDEA的遠程開發功能,可以將本地的編譯、構建、調試、運行等工作都放在遠程伺服器上執行,而本地僅運行客戶端軟體進行常規的開發操作即可,舊版本IDEA目前不支持該功能.,本例使用的是IDEA2023.2.5版本 下麵介紹如何在IDEA中設置遠程連接伺服器開發環境並結合Cpolar內網穿透工具實現無公網 ...
  • 本文解釋為啥會有響應式編程,為什麼它在開發者中不太受歡迎,以及引入 Java 虛擬線程後它可能最終會消失。 命令式風格編程一直深受開發者喜愛,如 if-then-else、while 迴圈、函數和代碼塊等結構使代碼易理解、調試,異常易追蹤。然而,像所有好的東西一樣,通常也有問題。這種編程風格導致線程 ...