技术架构评审
架构评审的价值与核心目标架构评审的关键要素1. 技术选型2. 高性能3. 高可用4. 可扩展性5. 可伸缩性6. 弹性处理7. 兼容性8. 安全性9. 可测性10. 可运维性11. 监控与报警项目阶段与架构设计的平衡
架构评审的价值与核心目标
在互联网时代,敏捷迭代成为主流,但传统方式常被认为流程复杂、效率低下。然而,架构评审或技术方案评审依然是至关重要的环节。其价值在于:
- 集众人之力,提前发现问题:通过集体分析,找出方案中的潜在问题,避免上线后出现不可逾越的重大技术难题。
- 对项目健康发展至关重要:提前提出质疑,确保项目顺利推进。
架构评审的核心目标包括:
- 设计把关:确保方案合格,避免缺陷和遗漏,至少做到不犯错。
- 保证架构设计合理性和一致性:符合整体原则。
- 维持系统架构的全局认知:避免黑盒效应。
- 发掘创新亮点,推广最佳实践:通过评审发现亮点并推广。
架构设计需平衡合理性和可扩展性,避免过度设计。不仅要考虑功能实现,还要关注非功能需求和持续运维,结合工程实践经验进行平衡和取舍。
架构评审的关键要素
架构评审需要从以下多个方面进行详细考量:
1. 技术选型
- 为什么选用A组件,而不选用B、C组件?
- A组件是开源的,其开源协议是什么?
- 基于什么语言开发的?出现问题时我们是否有能力自行维护?
- 性能方面是否进行过压力测试?
这些问题都需要在技术选型时明确,才能做出最终决定。
2. 高性能
- 产品对应的TPS(每秒事务数)、QPS(每秒查询数)和RT(响应时间)是多少?
- 设计上能够达到的TPS、QPS和RT是多少?
- 随着数据量的增大,系统性能是否会明显下降?
- 随着业务量和数据量的上升,如何进一步提升系统性能?
- 系统的性能瓶颈在哪里?
- 是否具备抗突发性能压力的能力?大概能满足多少TPS和QPS?
- 如何实现高性能?
这些问题都需要深入思考。
3. 高可用
- 是否存在单点组件?非单点组件如何实现故障转移?
- 是否考虑过多活方案?
- 是否存在数据丢失的可能性?如何恢复数据?
- 系统宕机时,对业务会造成哪些影响?是否有其他补救方案?
这些问题需要明确,并有相应的解决方案。
4. 可扩展性
- A和B的业务策略相似,后续是否会衍生出C的业务策略?
- 随着业务发展,哪些环节可以扩展?如何扩展?
- 架构设计上需考虑业务的可扩展性。
5. 可伸缩性
- 每个环节的服务是否无状态?是否可以快速横向扩展?
- 扩容是手动还是自动?扩展后是否能提高响应速度?
- 这些问题都需要思考清楚,并有对应的解决方案。
6. 弹性处理
- 消息重复消费、接口重复调用的服务是否保证幂等?
- 是否考虑了服务降级?哪些业务支持降级?是自动降级还是手工降级?
- 是否考虑了服务的超时熔断、异常熔断、限流熔断?
- 触发熔断后对客户的影响是什么?
- 服务是否做了隔离?单一服务故障是否会影响全局?
这些问题需要有明确的解决方案,以确保架构设计的合理性。
7. 兼容性
- 上下游依赖是否梳理过?影响范围有多大?
- 如何进行新老系统的替换?新老系统能否来回切换?
- 数据存储是否兼容老的数据处理?
- 如果对上下游系统有影响,是否通知到上下游业务方?
- 上下游依赖方进行升级的方案成本如何最小化?
这些问题需要有完美的解决方案,稍有不慎会导致故障。
8. 安全性
- 是否彻底避免了SQL注入和XSS攻击?
- 是否存在数据泄露的可能性?
- 是否做了风控策略?
- 接口服务是否有防刷保护机制?
- 数据和功能权限是否做了控制?
- 小二后台系统是否做了日志审计?
- 数据传输是否加密验签?
- 应用代码中是否有明文的AK/SK、密码?
这些安全细节问题需要考虑清楚,安全问题任何时候都不能轻视。
9. 可测性
- 测试环境和线上的差异有多大?
- 是否可以在线上做压测?线上压测如何隔离测试数据?
- 是否有测试白名单功能?
- 是否支持部署多套隔离的测试环境?
- 测试黑盒白盒工作量的比例是多少?
- 新的方案是否方便测试,这也是需要考量的因素之一。
10. 可运维性
- 系统是否有初始化或预热的环节?
- 数据是否呈指数级别递增?
- 业务数据是否需要定期归档处理?
- 随着时间推移,如果压力保持不变,系统如何巡检和维护?
- 业务运维方面的设计也需要充分考虑。
11. 监控与报警
- 对外部依赖的接口是否添加了监控与报警?
- 应用层面系统内部是否暴露了一些指标用于监控和报警?
- 系统层面使用的中间件和存储是否有监控报警?
只有充分考虑到各个环节的监控和报警,才能在问题出现时第一时间通知研发,阻止故障进一步扩散。
项目阶段与架构设计的平衡
不同阶段的项目有不同的目标。在项目起步时,我们不会直接设计支持99.99%可用性、百万QPS的架构。高效完成项目的业务目标也是架构设计的重要因素之一。
随着项目的发展,公司中间件和容器的标准化逐渐推进,很多架构工作被标准化替代。业务代码需要考虑的架构方面,如伸缩性和运维性等需求越来越少,这些工作逐渐由架构和运维团队接手。
在项目初期,我们可以花一点时间考虑这些问题,但并不是所有问题都需要有最终方案。
Loading...