1、千萬量級線上代碼精簡實踐馬陽陽去哪兒旅行 資深研發工程師馬陽陽去哪兒旅行 基礎架構組 資深研發工程師、公司云原生 SIG 成員,負責測試環境治理平臺、代碼精簡平臺,專注于云原生、效能領域。22 年深度參與的“線上代碼精簡50%”項目獲得公司級技術型一等獎,指導多個團隊完成系統精簡,積累了大量經驗。目錄CONTENTS精簡項目背景01 服務精簡實踐02 代碼精簡實踐03 精簡收益04 未來展望05 01精簡項目背景精簡項目背景01020304短周期業務多復雜度單調遞增人員流動頻繁業務歷史悠久人均代碼:10W一年內無變更應用:20%線上方法行覆蓋率:40%人均應用:5個維護成本需求耗時研發效能精簡
2、項目背景 問題精簡項目 目標&挑戰目標高范圍廣無參考50%50%代碼精簡服務精簡精簡項目 里程碑及組織架構規劃2022.52022.112022.7服務精簡代碼精簡公共支撐團隊(虛擬組織)機票酒店門票火車票其他通用工具技術支持提出需求獲取幫助精簡項目 服務、代碼 精簡兩步走找得到刪得好能篩選出來目標對象準、全、快通用方法論 篩選模型特征挖掘特征度量數據收集特征匹配從具體手段入手明確可度量自動化02服務精簡實踐可精簡服務-特征挖掘刪除合并低價值:沒流量不迭代業務維度:業務域業務流程重要性質量維度:性能穩定性可用性安全邊界業務線公共支撐團隊可精簡服務-特征度量沒流量網關Trace定時任務不迭代發布
3、少Config網關服務 B服務 A服務 C“刪得好”標準化平臺化自動化應用刪除標準流程人工確認開始計劃中待下線下線中已下線觀察中域名主機應用等結束確認期預回收觀察期回收期03代碼精簡實踐可精簡代碼-特征挖掘未被引用的方法(靜態)重構沒有流量的方法(運行時)量大(效果)通用性(效率)業務線公共支撐團隊特征度量-方案選型方案一:AOP編寫Agent加載AgentAgent記錄日志上報、存儲日志DB取出日志獲取代碼全集可精簡代碼集方案二:Agent 字節碼插樁特征度量-方案選型1、猜測:有方法執行次數的計數器2、有辦法用 java 代碼讀到方法計數值嗎?Serviceability AgentCod
4、e解釋執行編譯執行起初執行多次后方案三:基于 SA 工具特征度量-方案選型方案三:基于 SA 工具包裝 jarattach探測方法計數跑數:探測 JVM 中方法計數,并保存結果的過程 STW 消耗內存特征度量-方案選型方案性能損耗故障風險實現復雜度AOP 攔截器高低高Agent 字節碼插樁低中高基于 SA 工具無無低SA 方案詳細設計 性能無損跑數不接線上流量了(進程還在)重啟發布下線進行 SA 跑數pre_offline下線post_offline完成下線對業務性能損耗為零故障風險為零SA 方案詳細設計 跑數代碼實現Code解釋執行編譯執行起初執行多次后SA 方案詳細設計 解釋執行方法Cod
5、e解釋執行編譯執行起初執行多次后SA 方案詳細設計 編譯執行方法Code解釋執行編譯執行起初執行多次后SA 方案詳細設計 計算可精簡方法集聚合,取并集有流量方法集取差可精簡方法集靜態代碼分析工程方法全集Java Spoon 框架是一個用于在 Java 代碼中進行代碼轉換和代碼分析的開源框架。它基于Java AST 技術,提供了一組簡單易用的 API,可以用于重構、分析和生成 Java 代碼。SA 方案業務流程圖“刪得好”-多種手段全自動手段半自動手段克隆代碼創建精簡分支刪除可精簡代碼推送分支人工 CR&發布注意代碼可編譯“刪得好”-最佳實踐全自動精簡半自動精簡按包路徑分重要性業務是否重要大倉庫否是否是半自動精簡全自動精簡重要包不重要包驗證“刪得好”0107beta 發布02Sonar、CR03自動化測試05灰度發布06全量發布觀察指標和業務上線流程一致04代碼覆蓋率04精簡收益精簡收益 目標回顧50%50%代碼精簡服務精簡代碼減少 50%(數千萬行)服務減少 26%精簡收益-分析開發域測試域交付域(CI/CD)運維域新人:熟悉成本需求估時需求耗時環境構建/更新時長編譯時長發布時長告警量精簡收益-度量3.022.69需求估時(天)%9.5270244發布耗時(秒)10.9%05未來展望未來展望配置精簡代碼行粒度依賴精簡腐化治理服務合并Q&A感謝聆聽關注QECon公眾號