架构设计系列文章,请参见连接。
背景
一个架构师在平时工作中的重点注意的工作内容,就指明架构师所设计的产品架构的各方面特性。重点是数据库的架构师会将认为所有的工作核心就是数据库。重点在运营模式的架构师会认为所有的工作都是业务模式,运营方法。
再加上公司整体规划与方向有着非常明显的弱化技术的要求,架构师为了KPI、OKR放弃对产品架构的关心。就会造成整个公司少了架构师还是正常运转的情况。但是做一个真实的比喻,就如同下图一样:
少了技术型架构师的驱动的公司,就像上图一样。在不做变更的时候会使用的很正常,很稳定。但是如果稍微做一点变更整个系统就会进入崩溃状态。
每一个上线的产品,最主要的问题就是稳定性。为了应用能够稳定的提供服务,需要考虑很多内容。其中性能优化就是很重要的一个考虑项。性能优化是事后解决性能问题的方法,也有很多事前解决性能问题的方法。下面整体介绍性能优化的各个方面。
前期规划
在做一件事情之前,需要对这件事情有深入的认识与理解。然后基于认识和理解之后,对事情进行分析。分析后做出整体做事的规划或方法,然后再着手进行实施。
根据上面做事方式的指导。先对性能优化这件事情进行整体的规划。因为性能优化是项目实施过程中的一个步骤,所以在这里将说明在项目实施过程与性能优化之间的关系:
上图中浅蓝色部分是项目管理过程中要做的。深蓝色部分是性能优化设计到的步骤。蓝黑色部分是项目研发过程中的内容。在上产品环境后,肯定还需要各种各样的性能调优工作。例如:最近几年淘宝,京东都在做《全链路压测》的事情。所以这件事情需要一直做下去。
- 调研:
在整体项目实施规划中,非功能需求是一个很容易被忽略的部分。我们在做设计的一个基本依据就是非功能需求。有了它之后就可以估算出系统的整体性能要求大概范围。根据这个范围以及成本、时间约束就可以对系统中需要使用的技术,不使用的技术做出一个前期规划与设计。
针对产品型的性能数据评估。因为产品是已经上线的,所以,就可以根据现有的数据以及即将来到的运营策划数据进行性能数据的评估。这里就需要了解现有系统的使用情况数据,性能、稳定性表现情况之后。在作出相关的评估与设计。
- 设计:
设计阶段中根据前面收集的功能需求,非功能需求以及约束进行分析。分析出问题域中的核心问题,周边问题并将这些问题域的问题使用解决域提供的工具进行解决。解决域中的工具取决于架构师准备了那些工具。所以,在同一个问题域下,架构师的解决域确定了解决的方式。
因为性能是设计的依据,而性能有事从非功能需求来的。所以,对性能的交付也是需要有验收过程与验收方法的。在设计过程中需要将性能的验收方法,验收标准一并进行设计。
在产品型的性能设计过程中是有相对应的《性能验收软件架构》需要同时进行设计的。因为性能验收也是一套独立的软件系统。不过这套软件系统的目标就是帮助业务系统达到更高的性能指标而存在的。
- 开发:
开发过程中需要有规范的流程。从代码质量到交付方式,都需要一套标准出来。这样就可以有效的保证产品可以按时按点保质的方式进行交付。
- 监控:
在产品上线后运维比较关注的是APM,开发比较关注的是Tracing。监控的主要目的是为整个产品提供运行时数据。因为之前使用各种方法评估的内容,都是通过不准确手段获取到的数据。真实的数据就可以体现出之前评估节点所做的评估的偏差。可以利用这个偏差对系统进行调整。也可以利用这个偏差对评估数据进行校正,以使之后的评估中的数据会更加准确。
在提供产品的性能优化数据之外,还需要在系统中制定多维度的《度量指标》用来帮助之后进行各方面的评估。例如:用户转化率,产品销售率,热点页面等等。这些数据对之后的运维,运营都是有着非常大的帮助。
- 调优:
这个是前期调优,在项目制或者产品制第一次上线之前进行调优。还有后期调优,即产品上线之后根据使用情况对系统进行有针对性的调整。这两类调整都是以性能指标为输入,以达到性能指标要求为输出的。所以,在下面会对其中每一步再做详细讨论。
- 上线:
在调优过程中可能会对系统的局部架构,部署设计,数据库设计等作出调整。所以,在上线时需要需要考虑针对这些变化怎样才能将变化推到生产环境。基本上就考虑三种类型的升级:部署升级,数据升级,服务升级。
- 部署升级:部署过程进行了升级,比如说之前直接部署在逻辑环境上,现在变成部署在K8S上。
- 数据升级:数据结构发生了变更,需要有数据结构上的升级工作。
- 服务升级:服务内部实现发生了变化,需要同时运行老版本,并验证新版本的要求。
实施过程
性能调优和压力测试有很多内容都是可以重复利用的。例如测试时需要编写测试方案,测试计划。都可以在性能调优时使用。下面是性能调优的实施步骤:
- 性能目标:
不管做什么,第一步都是要明确需要做什么。性能目标在上面已经可以通过评估,实际数据等获取到性能目标。
- 环境准备:
现在的项目基本上都是用微服务的方式进行发布。所以环境准备阶段需要知道服务的具体部署情况。需要知道哪些开源组件需要部署,哪些服务需要配置。并且还需要设置性能环境和发送性能请求的测试环境之间的部署结构,使性能验证过程中受到的外界干扰最小化。
根据之前的目标对性能环境进行部署设计。在性能环境中的部署设计最终可以推到生产环境,但是需要针对性能指标进行相关的节点数评估,服务器上的硬件环境的评估。
需要根据并发量考虑性能环境和测试环境之间的带宽。以及测试环境的配置,以保证并发量可以达到性能要求的水平。
- 工具准备:
工具准备需要准备压测工具和监控工具。一些压测工具顺带就可以做监控的事情但是很多时候还是要进行独立准备。可以使用JMeter、Load Runner作为压测工具。也可以使用分布式性能测试工具控制多台主机进行测试。
监控工具要满足即可以检测到APM又可以检测到Tracing的内容。并且可以监控多项数据,监控主机性能,监控数据库性能,监控中间件性能等。
- 测试方法:
即需要验证的场景,以及验证这些场景所需要的脚本过程。在测试计划中会编写要测试的场景,并对场景中的请求内容进行设计。
- 优化确认:
已经有了工具,有了测试方法,并且有运行环境。就可以进行测试了,测试会形成测试结果。再针对测试结果有针对性的优化。例如某个方法执行时间过长,就可以想办法降低这个方法的执行时间。数据库查询时间过长就可以优化数据库查询。
在优化完之后,在对优化的内容进行一遍性能验证。如果验证通过则进行下一步。如果没有通过则,在此优化。往复循环这个过程指导性能验证通过,就可以进行进入到下一步。
- 功能测试:
在做完性能调优之后,还是需要再进行一遍功能验证的。因为在优化过程中可能对之前的功能产生了未知的影响。所以需要在性能调优完成之后再进行一遍功能验证。
总结
选用性能指标是非常重要的,这样一眼看过去就知道哪里有问题。在有目标的情况下进行,针对目标进行优化的效率在开发过程中猜测可能有性能问题的点并优化的效率要高的多。在实施这套方法时,也可以享受性能提升带来的成就感。