性能是软件系统的一种质量属性,可以定义为“软件系统与其环境交互以获得价值和避免损失的程度”。性能就是在空间资源和时间资源有限的条件下,衡量软件系统正常工作的概率或程度。
狭义上讲,软件系统的性能优化指的是在尽可能少地占用系统资源的前提下,尽可能提高运行速度。
本书首先从性能优化的认知和方法论开始介绍,然后介绍如何建立性能测试与评估的体系。巴斯、克莱门茨和凯兹曼在《软件架构实践》一书中提到,性能是指软件系统满足时间需求的能力。相较国外性能方面的经典著作,本书的重点放在软件系统层面,如对网络、通信、客户端、单服务实体、数据库等方面的性能约束特点进行阐述,提出具体的优化方法与策略,并深入剖析缓存系统、消息队列在性能优化中的应用。
本书还通过具体的实践案例(如智能音箱、商城、营销红包、交易系统等)介绍各种性能设计与优化方法的应用,并解读全链路观测和压测的具体实现方法与应用场景,最后介绍云原生技术对性能的影响。
本书提出性能优化的点、线、面、体方法。其中,“点”指的是代码中的单个语句或函数,可以通过代码级别的优化来提升性能;“线”指的是代码中的执行路径,可以通过对算法和数据结构的优化来提升性能;“面”则上升到模块、子系统级别;“体”则指的是整个系统,可以通过整体性优化来提升性能。
笔者认为,性能是软件非功能特性的基本面。软件性能与稳定性、容量、可用性、扩展性、成本都存在一定的关系。性能低下,系统会被拖慢,服务会堵塞,此时稳定性是一个问题。同时还容易出现级联故障,可用性本身也会受影响。另外,性能与成本、扩展性的关系尤其大。我们知道,对于无状态服务,可以通过添加服务节点的方式来实现持续扩展以满足业务需求。但是,每一个节点都会有成本。通过对设计方案和代码的优化,需要扩展的节点数量可能大大减少,从而降低成本。单节点的容量会大幅度提升。
回到实际工作场景,如高管看报表场景,虽然此时容量低,并发低,用户量很少,但是必须高性能,需要在1s内打开页面并完成渲染,同时要求数据有足够高的准确性。而商品秒杀场景,用户量巨大,需要确保不超卖(数据准确性控制),系统能良好地提供服务(可用性)、快速响应用户,不能被拖垮(高性能+高稳定性)。
没有绝对的好设计,只有适合的设计,因此往往需要在设计上进行取舍。比如数据一致性和可用性之间的取舍:在分布式系统中,为了保证数据的一致性,在进行数据更新时需要等待所有副本都更新完成才能返回响应,这会影响系统的可用性。为了提高系统的可用性,虽然可以采用异步复制的方式,即在更新主副本后,异步更新其他副本,但会牺牲数据的一致性。另外,还有数据一致性和性能之间的取舍、可用性和性能之间的取舍等。
一本书,一旦交付给读者,评判权就不在作者了,希望阅读本书的读者将自己对本书的意见或建议告诉我们。另外,书中存在错漏之处,在所难免,若有发现,也欢迎反馈。我们在公众号“技术琐话”放了一个页面“《性能之道:分布式系统全栈性能优化》读者反馈”,欢迎大家批评和指正。
祝阅读愉快!