大家好,我是mikechen。
性能优化是大型架构的重中之重,也是大厂重点考察对象,下面我就全面来详解9大高性能优化方案@mikechen
本篇已收于mikechen原创超30万字《阿里架构师进阶专题合集》里面。

负载均衡
通过均衡负载,减少单点压力,提高系统的处理能力。
比如:可以使用Nginx、HAProxy.....等等,分发请求到多个服务器。
如下图所示:
通过水平横向扩展,不仅可以极大的提升性能,还可以可以可用性。
除此之外,还会涉及到好的负载均衡策略,比如:
轮询(Round Robin)将请求依次分配给每个服务器,优点:简单易用,适用于均匀分布的请求 ,缺点:不考虑服务器性能和负载差异。
加权轮询(Weighted Round Robin)为每个服务器分配权重,根据权重比例分配请求,优点:考虑到服务器性能差异,适用于异构服务器环境, 缺点:需要合理设置权重值,且不实时调整负载。
最少连接(Least Connections)将新请求分配给当前连接数最少的服务器。,优点:适用于长连接的应用,能动态调整负载,缺点:需要实时监控服务器连接数,开销较大。
以上我只是举例,你都需要考虑哪种负载策略更加高效,都可以优化。
分库分表
数据量大了,需要解决单库单表性能瓶颈,提升数据处理能力。
如下图所示:
垂直拆分:按功能模块拆分表、或库,可以降低数据量;水平拆分:还可以按数据范围拆分,比如:按用户ID、商品ID....等等来拆分;
无论你怎么拆分,最重要的都是降低数量量,可以提升整个数据库的性能。
当然,性能是提升了,也会带来很多问题,比如:分布式事务...等等问题。
读写分离
将数据库的读操作和写操作分离,分担数据库的负载,提高系统的并发处理能力和响应速度。
主库(Master):负责处理所有的写操作、和更新操作;从库(Slave):负责处理所有的读操作,主库的更新通过复制机制同步到从库。
除此之外,在实施读写分离时,需要综合考虑业务需求、数据一致性...等系统架构问题。
缓存优化
缓存优化,也是一大利器,比如:可以使用本地缓存:如Guava Cache...等,提升效率。
也可以使用,分布式缓存,比如:Redis、Memcached......等等,存储常用数据。
以及,考虑缓存策略:如LRU、LFU....,根据访问频率和时间清理缓存。
这些都是比较好的优化策略,可以根据自己的情况来选定。
索引优化
索引的优化,也是非常重要的,也是成本低见效快的典型:
比如:
可以通过创建合适的索引,根据查询需求创建单列、或多列索引;比如:B树索引、哈希索引...等,根据自己的情况来优化;以及,定期维护索引,重建、或重组索引,确保其效率;以及,定期分析查询日志,调整索引策略;比如:过多的索引会影响插入、更新操作性能,这也是需要定期分析和评估的。CDN优化内容分发网络(Content Delivery Network),简称:CDN。
通过分布在全球各地的CDN节点,将内容快速、可靠地传递给终端用户,减少服务器负载和网络延迟。
比如:将静态资源(如图像、视频、CSS、JavaScript...文件等)缓存到CDN节点,用户访问时从最近的节点获取资源。
就近访问,用户访问最近的CDN节点,提高访问速度。
异步优化异步处理,比如:使用消息队列(如Kafka、RabbitMQ....)处理耗时操作。
异步调用,比如:Promise、Future....,非阻塞式编程。
代码优化通过优化代码,提高执行效率、和减少资源消耗。
比如:
减少循环次数:避免不必要的重复计算;减少条件判断:简化逻辑,减少分支。避免重复代码:使用函数、或模块重用相同逻辑;优化对象创建:减少不必要的对象创建,使用对象池等技术。这些都是可以优化的,代码优化其实是成本最低的方案,可以提前来考虑。
算法优化选择高效的算法和数据结构,减少时间和空间复杂度。
例如:在一个已排序的数组中查找元素时,使用二分查找比线性查找更高效。
public int binarySearch(int[] arr, int key) { int low = 0; int high = arr.length - 1; while (low <= high) { int mid = (low + high) >>> 1; int midVal = arr[mid]; if (midVal < key) low = mid + 1; else if (midVal > key) high = mid - 1; else return mid; } return -1;}
所以,可以根据具体问题,选择时间复杂度、和空间复杂度较优的算法。
以上
本篇已收于mikechen原创超30万字《阿里架构师进阶专题合集》里面。