从0到1架构项目
一、架构的理解
架构是业务、技术开展工作指导,优秀的架构在系统可以轻松面对各种的不确定(系统不可靠、网络不可靠、业务快速发展、需求变更),良好的设计可以规避大量技术债,在技术转型、业务转型中发挥重要作用。
架构是开发工作纲领,在开展业务、研发前,需要进行项目评估,选择合适架构类型,可靠的实现方案,为发开工作进行指导。
架构方案确定可以控制项目风险,将各种不确定纳入可控的范围内。
架构也可以协调不同部门之间工作,需要多少硬件资源、每个部门需要做那些事情、一个部门的工作开始节点始于于上一个部门完成,各部门工作量分配等等提供参考,各部门职责明确,项目经理可以关键节点进行验收,为进度提供保障。
二、成熟度模型
架构工作不是一蹴而就,是根据业务不断演进。在项目初期选用简单架构可以快速满足业务需要,在业务不断增长中,不断迭代,完成单体到分布式,分布式到微服务,微服务到serverless演进。
2.1 初期阶段
在项目初期可能团队人员就只有几个人,要直接上到微服务架构,主要的挑战是:
- 人力不足
- 技术储备不够
- 时间不充裕
- 过度设计,业务规模没有达到量级
- 风险不可控
初期阶段技术负责人需要关注的几个要点:
- 制定开发规范
- 制定工作流程
- 技术培训
- 业务培训
- 项目文档化
- 项目整体架构方案选型,架构演进预留适配设计
- 争取尽量多开发时间
- 不招聘新手
2.1.1 开发规范
- 书籍
- 《阿里巴巴Java开发手册》
- 《重构改善既有代码》
- 《Effect Java》
- 《HeadFirst设计模式》
- 《并发编程实战》
- 开发插件
- P3C
- SonarLint
2.1.2 工作流程
- 需求评审
- 技术方案评审
- 开发排期
- 测试
- 需求变更评估
- 项目验收
- 上线计划
- 灰度发布
- 线上BUG热修复
- 数据订正
2.1.3 技术培训
- 通用模块分析
- 接口设计
- 数据模型设计
- 协议选择
- 技术选型分析
- UML、流程图、架构图绘图方法
- 技术预研
- 典型错误分析
2.1.4 业务培训
项目开发人员随着业务发展不断,同时也伴随这人员流动,一套完成业务培训流程可以让开发快速了解公司的业务,找到核心关键人员,识别项目可能出现的风险,对现有业务不熟悉,在技术方案设计时会有所遗漏。
业务培训一般是产品、项目经理、技术负责人负责编写,也采用迭代的方式,每个周期,更新现有培训文档,避免文档过时、遗弃。
2.1.5 项目文档化
开发人员不光要避免口头需求,同时开发内部也应该避免口头讲解项目。
当接收到复杂需求,做技术实现方案时,主导人员需要将实现方案文档化。
文档化主要指:
- 服务架构图
- 数据模型图
- 系统交互图
- 状态变更流程图
- 关联表结构、字段说明
- 接口设计
- 时序图
- 类图
- 操作栈数据流转图
优秀的文档,开发人员拿到手即可进行开发,开发与开发之间、开发与运维间、乃至开发与产品、开发与业务方的沟通语言,基于文档、图、视频的方式,减少口头信息传递造成的误差。
2.1.6 顶层适配设计
敏捷开发,并非是完全抛弃架构、详细设计,完全使用最简单最快捷成本最低的方案,反而是前期没有评估好,造成后期迭代困难,架构无法快速支撑业务,付出几倍于以前的成本完成改造,改造过程也同样充满风险。
举个例子:
在项目前期中,不同领域模块之间进行交互的方式,可以基于Pub/Sub发布订阅模型完成,达到模块解耦,后期项目拆分微服务,也可以很快完成切换。
Spring
的事件监听EventListener
Guava
的事件总线EventBus
RabbitMQ
的消息队列
普通非报表查询,将多表关联拆分为单表查询,在后续数据库分库分表能做到最小变更,报表查询可以使用CQRS
读写分离模式,单独写一个查询服务聚合多数据源多表数据关联查询,在项目业务达到一定规模,实现数据中台,离线分析、实时分析,ETL
输出结果表、维度表。
项目前期单体应用锁的设计
顶层抽象ILock
继承Lock
,增加leaseTime
超时释放,简单死锁规避、注解式等等
常见锁的方案
- 基于
RDS
- 基于
Reetrantlock
- 基于
Redis
- 基于
Zookeeper
- 基于
Etcd
......
在单体到集群过度,可以选择不同方案,注入实现类,即可完成切换
2.1.7 尽量多开发时间
上述很多工作都是需要正常开发之外的时间完成,如果在项目排期时仅仅考虑需求开发时间,是无法完成架构设计工作,需要技术负责人与产品、业务进行沟通,正常开发时间乘上一定系数,指定排期计划。
2.1.8 新人成本误区
项目初期,第一版的成本关系着项目组是否还存在,新人的成本远远高于高级开发,并且新人常常对于项目评估、自身能力判断是不够准确的,项目经验、风险把控几乎是零,再则上述很多事项,并不是一个新手就可以在紧凑的开发周期抽出时间完成。
2.2 中期阶段
ing..