Java大厂应用|阿里P7教你如何快速熟悉一个系统
文章目录
- 业务知识
- 技术知识
-
- 逻辑部分
- 开发部分
- 系统运行
- 物理架构
- 数据模型
- 系统维护
- 上手实战
- 小结
大家或多或少都有接触一个已存在的系统,面对不是自己做的东西都有觉得上手有些困难,笔者想从自身的经验去谈谈如何快速上手一个陌生的系统。 打算从以下几个维度去分析落地:
业务知识 【Java大厂应用|阿里P7教你如何快速熟悉一个系统】从业务角度去学习系统,说白了就是从客户视角看系统提供了什么功能,一定是人能理解的维度,这样也方便你去理解系统。从业务下手则你需要去找设计 产品 运营等相关领域的人去了解,也有些对外的产品文档,方便用户熟悉系统的,都可以入手去学习。
业务知识可以按如下分类:
- 市场定位如何?哪些用户
- 竞争产品有哪些,有些公司同样在做?
- 主要特性有哪些?解决啥问题?
- 未来发展方向是啥样的?
逻辑部分 逻辑架构着重考虑功能需求,系统应当向用户提供什么样的服务,关注点主要是行为或职责的划分。这里搞清楚各个模块的对应的角色以及功能、职责就OK了。逻辑架构的核心设计任务是模块划分、接口定义、领域模型细化。
关注点:
- 有哪些子系统或模块?系统之间是什么样的关系?
- 对外上下游接口有哪些?对接人是谁?
- 关键业务流程怎么实现的?用类图、序列图等方式表达出来。开发部分 主要是代码架构,主要关注系统源代码、SDK、框架、中间件、工具包。
主要关注:- 开发工具,以及代码git路径?
- 产品包如何编包,各部分如何划分,例如MVC架构
- 用了哪些工具包?如apache commons、guava
- 用了哪些中间件?如messagequeue,struts spring
- 依赖哪些平台?如中间件 flink 等
主要关注:
- 系统能支撑多少qps?峰值qps多少?
- 与上下游系统怎么交互的?rpc?http?同步还是异步?
主要关注:
- 系统如何发布部署?有哪些部署环境?
- 系统有多少台机器?
- 系统部署怎么部署的?关注接入层,部署方式,如集群部署、分布式部署等
- 有没有容器化?
- 有没有多机房部署?
主要关注:
- 数据存储在哪?用了什么数据库,如oracle、mysql。
- 数据之间依赖关系
- 数据是否涉及大表分库分表等?
- 用了哪些nosql库,如kv存储?
- 有哪些数据同步任务?
- 大数据框架的使用情况如何?
主要关注:
- 会出现什么严重问题,怎么止血?对系统的压力很大,这时候很容易出问题。
- 对关键功能是否有监控?需要看系统有配置了哪些报警项,监控了哪些方面。
- 出了问题怎么解决?日志在哪?是否有全链路跟踪?是否有一些紧急操作,比如开关配置、降级、限流配置。
- 系统有哪些坑?找开发同学回顾历史问题,以免踩坑。通过同事总结的case,或者与负责的产品、运营、技术与了解。系统总会有一些坑,需要把这些坑填上。历史代码经过多次迭代总会导致复杂度高(分支、嵌套、循环很多),存在设计漏洞,性能隐患等,很难维护,这些就需要我们去重构了。记住有一句话:填的坑越大,能力越大。
- 运营、客服反馈的主要关注有哪些?
以笔者经历的几个大厂的项目为例,具体讲讲如何上手实践,仅供参考:
项目1:
在阿里内部有很多的数据平台,其中有很多的大数据平台,有个内部平台叫 blink 在开源社区叫 flink。blink作为一个大数据通用平台,是提供了标准的API。你调用API去提交一个job 会给你返回一个唯一的jobId。这个jobId在blink 内部是严格唯一的(后续大数据分析都会依赖这个jobId)。有个这个jobId你就可以到内部的kepler平台去根据JobId 找对应的计算任务,计算任务会被拆分很多算子,每个算子 串联起来就是整个job流,计算任务里面有过程日志,也有异常日志,如果你感觉计算job没有输出,则你应该先看异常日志,是否有exception。如果无异常则你看整个流程里面各个算子是否有输入输出流量,如果串行流的输入输出对不上,可能是你的算子条件不对把流量全部过滤掉了,还有重可能就是计算任务堆积了,这个时候你要到job的统计信息看是否有时延。。。。
通过这个我想表达的时候,只有通过实践你才知道整个业务流程是什么样,以数据为载体整个流动原理是什么。
项目2:
再举个例子,笔者曾经搞过分布式存储系统,在HW以及阿里都搞过。分布式存储系统里面有很多系统节点: 比如 Ngix 业务系统 数据存储引擎 硬件存储等。如果看到的时候客户端时延很大,你该如何去分析?搞清楚这个问题首先就是要定界,数据流经这么多系统,到底是哪个环节出问题。怎么定界?可以用网络抓包啊 这些系统基本都是跨网卡的,你就可以用 wireshark 去在各个系统节点去抓包,通过对同一个报文的输入输出看时延 来确定系统是否有问题。但是一般来讲 网卡不是瓶颈,磁盘才是短板(这个就是经验问题了)。举个笔者曾经的问题定位案例:客户上传一个大文件,很卡。首先看盘的iostat统计发现不高,说明服务端的硬盘不是瓶颈,接着看服务端的网卡流量,利用率也不高,基本认为就是客户端问题,再看客户端的上传带宽发现确实只有xM,而客户说以前是xxxM。再看客户的SDK的调用,发现大文件他调用的接口用错了,不是并发上传的接口,是个单线程接口。问题很快定位。
通过这个问题想表达的是,通过实践增强定位问题的能力的关键是问题范围缩小,把可能性给缩小直到找到问题
小结 笔者认为,首先心态上不要刻意去在意这是别人写的代码,我熟悉很困难。就权且认为是自己很早之前写的代码,现在要重新把这个代码捡起来,需要回忆去恢复记忆。这个过程中可能就需要一些活动去辅助:比如问题定位,比如需求开发,比如代码重构等,在这个过程中需要不断画系统全景图,逐步把整个系统掌握了。
推荐阅读
- JAVA(抽象类与接口的区别&重载与重写&内存泄漏)
- Docker应用:容器间通信与Mariadb数据库主从复制
- JS中的各种宽高度定义及其应用
- 事件代理
- Java|Java OpenCV图像处理之SIFT角点检测详解
- java中如何实现重建二叉树
- 数组常用方法一
- 【Hadoop踩雷】Mac下安装Hadoop3以及Java版本问题
- Java|Java基础——数组
- RxJava|RxJava 在Android项目中的使用(一)