(转载)一份平民化的应用性能优化检查列表(完整篇)

2022-03-07  本文已影响0人  生饼

注:本文内容完全转自江南白衣的同名博客。因为这篇博客原始链接已经无法访问,故记录在此

1.总原则

一些正确但稍显废话的原则,但能指导后面每个章节的优化,所以还是要啰嗦一次。

  1. 可扩展性架构,堆机器能不能解决问题是最最优先考虑的问题
  2. 去中心化的点对点通信,优于通过中心代理的通信
  3. 池化的长连接,优于短连接
  4. 二进制数据,优于文本数据
  5. 尽量减少交互,一次调用的粗粒度聚合接口 优于 多次调用的细粒度接口
  6. 尽量减少交互,批量接口优于循环调用
  7. 尽量只交互必要的数据
  8. 尽量就近访问
  9. 尽量使用缓存
  10. 总是设定超时
  11. 在合适的场景,并行化执行
  12. 在合适的场景,异步化执行

2.环境准备

保证符合自家各种规范(没有的话赶紧回家写一个),尤其线下压测服务器的配置要与生产环境一致。

2.1 操作系统

2.2 JVM与应用服务器

2.3 周边依赖系统

2.4 后台辅助程序

2.5 测试程序

2.5 流量模型

大家在心里都有这么一个大概的模型,但很少认真写出来。

行文到此,大家大概可以感受到这份checklist的风格,都是大家明白的道理,但可能一时也会忘掉的,这里啰啰嗦嗦的給写下来。


3.数据库

特别鸣谢,我司DBA。

3.1 拓扑

根据扩展性原则考虑:

3.2 Schema

自家规范应包含:

3.3 SQL

1. 自家规范应包含:

根据尽量少数据原则与尽量少交互的原则来设计SQL:

根据扩展性原则,将负载放在更容易伸缩的应用服务实例上:

  1. 联系DBA进行MySQL统计的慢查询的Review,解析SQL查询计划时尽量避免extra列出现:Using File Sort,Using Temporary

3.4 DAO框架

3.5 事务

连接池

选型:

连接池的配置:

番外篇:在分库分表时,可考虑基于HikariCP二次开发,减少总的空闲连接检查线程数(比如128个分区,可能有256条线程),重用同一个实例上的库的连接等。


4.缓存

4.1 多级缓存

使用上述条件选择合适的缓存方案,或同时使用多级缓存,逐层回源。

4.2 综述

4.3 堆内缓存

选型:

GuavaCache:

4.4 堆外缓存

选型:

4.5 Memcached

客户端:

数据结构:

4.6 Redis as Cache

Redis拓扑:

基于点对点通信优于网关的原则,使用如下两种拓扑

服务端:

客户端:

数据结构:

命令:


5.服务调用

5.1 接口设计

1. 尽量少交互的原则:

支持批量接口,最大的批量,综合考虑调用者的需求与 后端存储的能力。

支持粗粒度接口,在支持原子细粒度接口的同时,支持粗粒度接口/聚合层接口,将多个数据源的获取,多个动作,合并成一个粗粒度接口。

2. 尽量少数据的原则:

在提供返回所有数据的大接口的同时,提供只提供满足部分调用者需要的轻量接口。

最好再提供能定制返回字段的接口。

3. 二进制数据优于文本数据

同样是一个简单通用性,与性能的选择,特别是大数据量时。

5.2 RESTful

仅以Apache HttpClient为例,大部分Restful框架都是对Apache HttpClient的封装。

另外OkHttp也值得看看。

5.3 自家RPC框架

每家的RPC框架特性不同,但考虑点都类似。


6.消息异步

6.1 选型

6.2 Kafka

6.3 RabbitMQ


7. 日志

7.1 综述

7.2 内容

7.3 异步日志


8. 工具类

8.1 JSON

FastJson:

Jackson:

8.2 二进制序列化

需要定义IDL的PB与Thrift,不需要定义的Storm等用的Kyro 都可选择,其他一些比较旧就算了。

8.3 Bean复制

在VO,BO之间复制时,使用Orika(生成代码) 或 Dozer(缓存反射),不要使用需要每次进行反射的Apache BeanUitls,Spring BeanUtils。

8.4 日期

JDK的日期类与字符串之间的转换很慢且非线程安全。

继续用Java日期不想大动作的,就用CommonsLang的FastDateFormat。

能大动作就用joda time,或者JDK8的新日期API。


9.Java代码优化 与 业务逻辑优化

参考《Java调优指南1.8版》,对内存使用,并发与锁等方面进行优化。

规则前置,将消耗较大的操作放后面,如果前面的条件不满足时可。

另外前面提到的一堆原则,比如尽量缓存,尽量少交互,尽量少数据,并行,异步等,都可在此使用。

上一篇下一篇

猜你喜欢

热点阅读