1、项目/工作及成果
1.1 干线异常修复- 逆向商品确认运单找不到
<1>【背景】
当司机没有进行中的逆向运单时,会根据请求参数创建一个排线请求对象,将刚创建的运单写入主库,然而原有的强走主库获取运单的逻辑被修改,读取走了从库,就会读取不出来,报空指针异常
<2>【问题困难及解决方案】
该开始上手时,对于业务流程不熟悉,需要mentor指导寻找需要更改的接口;此外,针对该异常,自己提出了两种解决方案,分别为使用带参的构造函数新建一个WaybillInfo对象和使用重试机制,但是没有考虑到代码的扩展性与健壮性,这两种方案也被否决了。经过商讨,对于这种由主从延迟导致的异常,可以通过强制走主库的方式解决
- ① 对取运单的逻辑进行优化。从代码逻辑上看,完全没有必要写入完就读取运单信息,可以根据driverCode获取运单信息
- ② 支持根据司机Code强制走主,查询该司机正在进行中的逆向运单
<3>【工作结果】
经过开发、自测后上线,线上观察到流量和数据均正常,成功解决该问题
<4>【收获】
在业务方面,对于业务流程进行梳理,有了更详细的了解,同时也输出了仓网运输的学习文档。在技术方面,提出的技术方案需要经过评审,因为解决问题不仅仅是解决自己遇到的问题,更要注意对其他业务侧的影响,对之后业务扩展开发的影响。
1.2 干线异常修复-配送单找不到
<1>【背景】
当配送完成时,第一次点击确认,配送单正常签收,重复点击时,取出的配送单为空,会抛出异常“没有查到配送单,请联系工作人员”,但此时该配送单已经在第一次点击的时候已经签收了,是可以取出配送单的
<2>【问题困难及解决方案】
这个异常可以说算是一个“顽疾”,很不容易排查。在新建一个QueryDeliveryOrderRequest对象时,confirmStatus字段设置为0,第一次查询时,经过映射后其值还是0,可以正常查出并修改为1;当第二次查询时,该字段会和运单号一起联查,发现该状态不是0,所以会查不出结果。找出原因后,按照下面的两个逻辑对该异常进行治理
- ① 对取运单的逻辑进行优化。根据配送单号查询,不再加额外状态判断,查询到单据类型已签收返回business_error,查不到配送单再返回business_critical_error
- ② 将QueryDeliveryOrderRequest对象的confirmStatus字段赋值为-1,避免无关字段在数据库查询时造成影响。经过层层调用,使用NumberUtil.wrapQueryNumber()这个工具类,将其设置为null,这样,查询数据库的时候,仅仅使用了配送单单号这一个字段进行查询
<3>【工作结果】
经过开发、自测后上线,线上观察到流量和数据均正常,成功解决该问题
<4>【收获】
定位异常原因时需要仔细分析,不要想当然。学会了使用远程debug查看哪里发生错误,这不仅有利于自己的学习,还能够提高完成任务的效率。
1.3 干线异常修复-经纬度相同或不在中国
<1>【背景】
由于历史原因,线上测试数据中的点评实验室的经纬度不在中国范围内,致使地图上计算的距离为0,会产生线上报警
<2>【问题困难及解决方案】
这个异常是由于历史数据的经纬度不正确,需要前后端联合解决,我负责tes侧处理,在抛出此异常后,为了能够区分出是谁抛出的异常,提出了用额外的字段进一步判断(获取城市ID),
- ① 针对“收发货地址是点评实验室”这种异常,捕获并忽略
- ② 针对“收发货地址不是点评实验室”这种异常,需要我们正常抛出异常。
<3>【工作结果】
经过开发、自测后上线,线上观察到流量和数据均正常,成功解决该问题
<4>【收获】
代码的规范性与可读性是写健壮代码的必要条件,此外,在写代码的时候要判是否为空,否则会引出新的异常,得不偿失。
1.4 牧羊人自定义组件优化
<1>【背景】
前端经过HTTP传递到自定义组件的参数有问题时,组件会抛出异常,当调用量很大时,就会出现很多异常,因此,需要对该组件优化,减少异常告警
<2>【问题困难及解决方案】
为了不影响下游,同时让下游可以感知到是什么原因导致的异常,首先去掉之前抛异常的操作,然后是新建一个类TmsDriverReponse,包含了code、message,在Tracer中添加key值loginTmsDriverResponse的键值对,记录异常信息
- ① 当出现异常时,塞进错误码、错误信息,排查问题时,可以根据traceID定位到是哪个位置出错导致的异常。
- ② 当没出现异常时,可以沿用之前的旧逻辑
<3>【工作结果】
开发完成,测试中
<4>【收获】
相比于业务需求,技术优化需要的是大胆的想法,想出多种方案,探讨后找出最优的。此外,在开发工程中学到了许多中间件,如牧羊人、Mthrift、Octo等,提升了自己。
1.5 图片导出与发运时间导出
<1>【背景】
配合视觉团队的工作,导出运单及每个车型照片的链接地址和发运时间
<2>【问题困难及解决方案】
这是刚进公司时做的一个任务,难度不大,就是使用数据库查询出相应的结果,但是,由于刚入职,对于数据库中字段代表的含义不了解,同时也有许多相似字段或废弃字段给自己带来了困扰,不过,最后在coco姐的帮助下顺利解决。
<3>【工作结果】
顺利导出并交付
<4>【收获】
对业务流程进行了系统梳理并输出了学习文档,对部门的业务有了详细的了解,提高了自己的sql水平。
2、项目/工作中收获
实习期间,感受到了周围同事的谦逊与知识的渊博,这种友好又融洽的工作氛围激励着我,从第一周的熟悉业务到后期的参与开发并上线,再到各种技术知识的学习,极大地提升了自己。
2.1 技术提升
① 使用魔数平台从数据库中提取数据,既提升了自己的SQL能力,又了解仓网运输的表中各字段的含义,对我们组业务有了新的理解。
② 在实际项目开发中,熟悉了解并使用公司常用中间件(MCC、Plus、Mafka、MTThrift)的使用,提升远程rpc之间调用原理和应用能力,提升消息队列应用能力。
③ 学会了使用Raptor、MTrace、Logcenter以及日志文件定位错误;通过泳道测试环境Cargo,使用Postaman、HTTP链接或结合Mafka平台进行远程debug,进一步提高了问题排查的效率。
④ 学习了新接口开发、接入Shepherd、测试、发布的流程,参与了对组件的技术优化,提升了对牧羊人的认知。
⑤ 参与开发的完整流程,从技术方案评审、到开发、用Spock语法写单测、自测、CR,再到上线以及上线后流量观察,提升了自己的工程能力。
⑥ 学习了微服务框架SpringBoot以及Mybatis,对于AOP、注解、IOC有了更具体的认识
⑦ 熟练使用IDEA,提高了用Git、Maven协作开发能力;此外,更加注重代码的规范性与健壮性
2.2 业务提升
① 通过技术文档的学习与上手实操,学习并梳理了我们组负责的仓网运输业务,了解tes,tws,trunkline,bapi系统负责的主要内容,对接口相互调用有了清晰的理解。此外,对业务中各种表单(如调拨单、运单、装车单、配送单等)的作用、依赖关系和流转过程进行了梳理,极大提升了对业务流程的理解。
② 规范化开发流程,针对每个需求,要写技术文档,与其他RD一起评审;开发完成后,需要单元测试、自测、CR、联调等;此外,要制定排期,并按照计划执行。
③ 积极参加分享交流会议并参加培训考试,查漏补缺,输出自己的学习笔记,记录重点、难点、要点,提升了自己的业务能力和技术能力。
2.3 个人提升
① 通过参与完整的开发流程,有了严谨的工作态度,从技术方案评审,再到排期,开发,测试,联调,上线,需要我们严格遵守公司的规范来进行。
② 对于Java知识有了更深刻的学习,包括工具类、重试机制、范型、微服务框架SpringBoot等等,提升了自己的技术水平。
③ 提高了自己的沟通与表达能力,不仅要敢于向同事请教,敢于表达自己的诉求,也要让自己的表述更加清晰易懂。
3、未来发展规划
3.1 短期规划
① 绘制业务流程图,帮助自己深刻理解业务场景、业务流程,提升业务能力。
② 多阅读优秀代码以及学习文档中的编码风格,加强对代码整洁性、规范性学习,养成良好的代码习惯。
③ 能够独立跟进业务需求,完成开发。
3.2 长期规划
① 进一步熟悉业务,熟悉业务各流程中涉及的上下游业务接口,逐步形成完整的业务端到端闭环。
② 持续学习,注重知识学习的深度。对技术的学习不能停留在表面的了解和使用,对其底层的实现原理也要有学习和一定的理解。
③ 加深对开发框架和各种中间件的理解和使用,进一步掌握业务常用开源工具、内部工具的使用方法,提高自己的开发能力。
④ 积极了解团队重点业务以及发展方向,为团队建设做出贡献。
4、其他补充
很感谢这段时间峰哥、coco姐、晟哥以及组内其他同事的帮助,大家学识渊博又谦虚可爱,诲人不倦,给了我很深的触动,这将是一段宝贵的经历停留在我的脑海中,很感谢实习期间大家对我的帮助和照顾。