《1-马阳阳-千万量级线上代码清理实践.pdf》由会员分享,可在线阅读,更多相关《1-马阳阳-千万量级线上代码清理实践.pdf(42页珍藏版)》请在三个皮匠报告上搜索。
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未来展望未来展望配置精简代码行粒度依赖精简腐化治理服务合