作者:TGE-Transaction-唐封云(Terry Tang)
背景
Lalamove自2013年起就开始基于PHP构建系统,之后逐步迁移至Java。随着海外业务增长,业务复杂度和技术复杂度也快速上升。PHP遗留服务,成为系统顽疾:
-
技术支持层面:公司最新基建以Java为主,缺少PHP支持。
-
PHP自身特性:稳定性,效率,扩展性等问题困扰研发团队。
因此,我们于24年底启动代号为“P2J"的项目,旨在1年内完成核心链路中全部数十个关键PHP服务的Java化。项目范围庞大,共1000+PHP接口需要Java化,上游100+个服务需要完成1200+接入新的Java接口场景。几乎涉及到Lalamove全部业务团队。
项目最终在时间,效率,质量方面优于预期的情况下完成交付。过程中遇到的问题和解决方案,值得和大家分享。
项目实施的挑战
从PHP接口维度看,推进节奏简单明了:PHP接口先完成Java化,上游服务择机完成新接口接入,待所有接入完成,服务即可下线。但是,从工程的角度看,一个大型项目的实施,不仅仅是简单的Java语言翻译,是一个系统工程。对时间,效率,质量的期望,除了常见的技术问题挑战,也会面临一系列工程挑战。
挑战1 -复杂度和时间的矛盾
-
复杂度主要来源于:规模,人员,业务复杂度,技术复杂度等。
-
服务间调用关系错综复杂,任务之间存在依赖耦合,影响资源的高效利用。
案例:OrderInfo.get_order_info 接口,java化之后,有多个上游服务需要接入。该接口正常排期,从开发到完成切流,需要1个半月。如串行推进,每个上游接入至少需要等待1个半月。
问题:如何使用最少的资源,按时交付最多的任务?
挑战2 - 稳定性与效率的矛盾
-
PHP代码经过10多年迭代,大量代码屎山,个别核心服务,无效代码代码占比超过30%。
-
多个任务并行上线,切流等,放大了链路出错概率。
案例:下单链路,25年2月51个接口同时切流。任何问题都会直接影响下单链路可用,P0事故妥妥的。
问题:如何在大量干扰,并行情况下,依然保障最佳稳定性?
解决方案
过去我们也做过多次中小规模的Java化迁移项目,通常是PHP服务负责团队主导,一次最多涉及到几个服务,下游PHP服务改造完成后,上游服务在某个不确定的时间接入。导致整体时间长,质量上参差不齐。我们吸取了过去Java迁移的教训,有针对性地制定我们的解决方案。
-
技术方案:识别全局通用技术需求,要做到简单,标准化,可复用。
-
质量保障方案:建立质量保障体系,兼顾测试广度和深度。
-
项目管理:全面的项目管理计划,重点关注风险管理和进度管理。
技术方案
全局切流方案
切流方案两个设计原则:
对上游无感,平滑切流
Java新契约最大程度和PHP一致,降低接入成本
基于切流方案原则,统一提供切流方案:
全局对比方案
Lalamove/货拉拉内部自研的录制和对比工具为我们提供了录制对比能力。大于60%的PHP接口通过工具对比后,全程无需QA介入,直接上线。保障质量的同时,能极大减少研发和QA资源。
全局监控&告警系统
识别研发流程引进的监控盲点,早发现,早解决。
重构
避免炫技式重构,鼓励可控的领域重构。通过重构,整体上减少了20%的任务量:
-
避免PHP技术债务传递到新的Java服务,实现服务领域化。
-
合并+精简逻辑
AI提效
- AI工具非常适合跨语言迁移项目,使用场景多样,覆盖了研发生命周期。在本项目中,AI生成了约7%(15w行)的代码。
-
AI使用场景案例 - 司机系统的PHP接口java化
-
按照编码规范,项目架构规范,手工实现一个接口
-
在Cursor上配置User Rules,要求Cursor参考已实现的接口和规范,生成代码
-
对生成的代码微调,测试,上线。
-
减少50%的工作量。
-
质量保障
测试质量保障体系
目标:全面、深入、高效地完成测试交付
测试效率和质量
测试效率:
我们通过提前规划、动态调整、工具提效的策略,保证整体的测试进度:
**案例1:**基于自研的测试场景编排工具Autoflux,进行订单主流程新旧流程巡检,检查不同的支付方式✖️订单类型✖️订单操作,覆盖所有订单核心链路。
案例2:PHP接口在转Java后,原有接口自动化失活,需要补充对应新接口的自动化用例,用来做日常准出的流水线卡口校验,以OrderInfo服务接口自动化为例,本次项目新增27个接口,使用Cursor自动生成接口自动化测试用例,相比于P2J项目前手动编写的自动化测试用例,编写效果提高了10倍。通过使用Cursor补充完全部新Java化接口case节省工时:800+ mandays
测试广度:
在开发自测阶段,我们提供测试工具,赋能开发自测,提高提测质量
在QA测试阶段,我们对参与P2J测试的QA进行持续培训,保障测试的基线
测试深度:
我们针对接口容易出问题的点,对应进行了多项专项测试:分流测试、并发测试、本地化测试、故障注入测试、兼容性测试、探索性测试、性能测试等,发现了很多深度BUG。
案例:
项目管理
当技术复杂度与组织/规模复杂度叠加,大型项目单纯依靠技术手段往往容易失控。我们需要做好项目管理规划,确保项目能按预期交付。
风险管理
提前识别技术、业务、团队、外部依赖带来的风险。做好风险应对措施。一些常见的风险和应对如下:
-
团队项目早期经验不足:需要持续培训。
-
切流过程可能出现问题:需要回滚SOP。
-
服务下线后,发现还有遗留流量:需要服务下线SOP。
-
项目临时资源冲突: 需要明确的项目优先级定义,做好资源冲突发现机制和预案。
进度管理
项目参与人数众多,避免低效沟通,让相关负责人从低效沟通释放出来。飞书多维表格作为一种轻量级低代码平台,在项目中广泛应用在以下场景:
**任务状态可视化:**让关键信息无所遁形,辅助决策。
**进度风险触达:**让进度风险实时触达相关人员,及时干预。
结语
本文完整的记述了Lalamove一次Java化大型项目的实践过程,可以说是一次相对全面的经验总结。其中一些执行细节,也不是一开始就能做到面面俱到,一些问题在执行过程中被识别,解决后沉淀成研发SOP,或者其他项目规范。这些经验总结考虑到普适性,希望其中的方案能对读者有所帮助,通过参考,不仅仅能使用在Java化项目,其他语言迁移项目,甚至其他的大型项目上。