高性能系统开发的几个手段
1 为什么需要高性能系统
高 qps 系统近年来主要集中在电商,广告这两个行业中。原因在于规模效应下带来的可观回报。大厂数百台实例已经很常见了,在业务上对系统进行横向和纵向的切分变得很重要,通过微服务等技术将各个模块进行解耦实现系统的动态扩容。在这种场景下某个服务接口降低延迟,提升 qps 变得很重要。相对而言每日近百亿级别的流量下提升 qps 显得很重要。否则一般通过增加实例即可。对于系统来说实例机器增加到一定程度会增加系统的复杂度,比如网络风暴,数据一致性等维护性问题。
2 需要注意的几点
IO: 一般来说分为网络 IO 和系统 IO。这是造成系统瓶颈的一个重要原因。在大数据场景下 IO 一般受制于带宽,磁盘性能。要关注和监控的也在于带宽,磁盘空间,出现过低或过高要及时报警。对应服务使用方要做好熔断,服务提供方要做好限流。
集群:现在大多数公司都可以实现动态扩容功能,但需要注意扩容数量一定要有限制。否则容易造成第三方组件性能降低从而延时增高。比如数据库连接池数量,redis 或 es 数据倾斜。
数据一致性:高性能场景下数据一致性是限制性能的关键点,建议是能不用 db 就不用,能不用锁就不用,复杂场景下可以把耗费性能的服务单独提炼成微服务接口调用,事务性业务优先补偿性事务来满足业务要求。
3 提高性能的几种方式
1、改变数据结构
传统上就是空间换时间,但是也有特殊情况。主要点在于多参考开源软件如何实现性能最大化的,如反排,索引。
2、减少对象存活时间和利用率
很多资料上对这点讲的不是很清楚,相同配置下 2 个系统,假设系统 A 延时是 50ms,系统 B 延时是 200ms。大概率单机 qps B 是 A 的 4 倍。我举这个例子是想说明一次请求到响应的时间越长,那么这个 thread 里停留的对象也越久。系统能创建的 thread 也就越少,可以参考之前的文章https://xie.infoq.cn/article/1270debe98ff256425f108934
如何判断自己的系统是否正常呢?可以打印 jvm 的 dump 文件,然后上传到一些网站上做分析。大多数是不需要做 gc 调优的。但是开发人员要清楚自己系统内什么对象数量较多,什么方法占用 cpu 较多。
评论