公司CEO和我说:在系统优化的时候,不要轻易用多线程

简介: 最近一段时间整个公司有不少应用上线,上线后慢慢开始暴露一些问题,除去bug之外,一个很值得关注的点就是系统的优化。毕竟优化系统不仅可以使得程序更加稳定,还能节省一些资源的浪费。作为一个技术氛围很不错的公司,很多人会把自己的优化方案发出来和大家一起讨论,只不过没想到这一讨论把公司CEO以及几位P8、P9大佬都给炸出来了。

听说微信搜索《Java鱼仔》会变更强哦!


本文收录于githubgitee ,里面有我完整的Java系列文章,学习或面试都可以看看哦


(一)前言


最近一段时间整个公司有不少应用上线,上线后慢慢开始暴露一些问题,除去bug之外,一个很值得关注的点就是系统的优化。毕竟优化系统不仅可以使得程序更加稳定,还能节省一些资源的浪费。作为一个技术氛围很不错的公司,很多人会把自己的优化方案发出来和大家一起讨论,只不过没想到这一讨论把公司CEO以及几位P8、P9大佬都给炸出来了。


网络异常,图片无法展示
|


本文将会介绍系统优化的常用方式,以及优化的一些误区。


(二)程序优化


2.1 慢sql


应用上线后,我们可以通过各种云产品监控慢Sql,以阿里云的产品为例,通过应用实时监控服务ARMS就能将一段时间内的慢Sql统计出来。慢Sql出现的最大可能就是Sql走了全表扫描,没有经过索引。检查Sql语句可以通过explain命令查看执行过程,如果没有建立索引就建索引,如果已经有索引就优化索引。另外要注意避免索引失效,比如一下六点就会导致索引失效:


  • 1、复合索引不要跨列或无序使用(最佳左前缀):索引的顺序和sql语句查询时的顺序一致


  • 2、复合索引尽量使用全索引匹配


  • 3、不要在索引上进行任何操作(计算、函数、类型转换)


  • 4、like尽量以“常量”开头,不要以%开头,否则索引失效


  • 5、尽量不要使用类型转换(显示、隐式),否则索引失效,如:


name的属性是varchar,这里变成了intselect*fromteacherwherename=123
  • 6、 尽量不要使用or,否则索引失效


2.2 在循环中调用查询外部服务的语句


在系统优化时,我们还看到了在for循环中去调用查询外部服务或者数据库的情况,比如像下面这样:

for (Stringuser:userList) {
UserresultUser=UserMapper.selectByName(user);
result.add(resultUser);
}

在一个循环中,多次调用数据库查询语句,要知道每次调用sql命令都是有网络开销的。遇到这种情况,建议将单次查询改成批量一次或几次查询,节省网络开销的时间。


2.3 接口只返回必要信息


这个要求主要针对那些调用量很大的接口,有些接口会返回大量的数据,有很多都是非必要的,导致网络传输开销大。


优化方案也很简单,调整返回对象,只返回需要的信息。


2.4 异步线程一定要用线程池


如果代码中涉及到异步线程的逻辑,一定要用线程池。有一个业务就出现了自己开线程,结果程序运行过程开了N多线程,直接把应用搞崩了。


(三)产品优化


3.1 查询增加时间约束


以我们现在所做的大数据应用为例,数据动不动就上亿,这个时候做好查询时时间范围的限制能给系统带来极大的性能提升。比如我们现在搜索用的ElasticSearch,就在产品测让用户每次进入时只看到最近三个月的信息。


如果用户想查看更多就让他们自己去选时间范围。根据正常的使用情况,每一百次查询,可能只会有一次用户自定义查询时间范围的动作,极大提高效率。


3.2 不让用户进行深分页


目前常用的前端分页主要有两种,第一种是展示给用户开头几页和最后几页,比如下面这种:


网络异常,图片无法展示
|


这种分页仅适合于数据量少的应用,另外一种分页方式是只展示当前页的前后几页,而不会给用户直接跳转到最后一页的机会,比如百度的分页:


网络异常,图片无法展示
|


我们要知道不管是哪种数据库的分页,页数越深,效率就越低。尽可能在产品测就不让深分页出现。


3.3 批量操作业务进行约束


很多产品喜欢设计一些很牛逼的功能,比如全选下载不设置任何限制。这在技术上是很不合理的设计,这一点上最好和产品沟通,批量操作设置勾选上限。


(四)系统优化误区


4.1 使用多线程提高效率


在大部分人的认知里,把单线程改成多线程总能提高效率,但就是这个问题的讨论直接把公司CEO以及好几位P8、P9大佬都炸出来了。这几位在阿里干了超过十年的大佬给出的一致意见就是,在系统优化的时候,不要轻易用多线程,你以为你提高了效率,其实可能已经埋下了很多坑


他们的结论来源于这么多年的经验,无论是http调用,springboot内嵌的tomcat;还是rpc的dubbo调用,他们本身都维护了线程池。所以除非业务调用时的RT时间无法忍受,否则真的不建议在服务方法里起多线程。除了带来代码维护的不确定性外,从机器整体cpu能支撑的qps来看其实并没有多大提升


有位P8表示他以前在一个部门待过,那里尽喜欢在代码里加多线程,结果就是写完代码之后,先找了一波人专门监控代码运行情况,然后再找一波人来优化代码。费时费力不讨好。


(五)总结


系统的优化不是什么高大上的技术,其实就是很多基本的知识。但是他又很重要,保证了系统的稳定和资源的节省。另外系统优化的目的是为了让应用运行更加稳定,如果系统优化导致应用变得不确定了,那就得不偿失了。


最后祝所有同行1024程序员节快乐,我是鱼仔,我们下期再见。



相关文章
|
Kubernetes Cloud Native 架构师
阿里研究员谷朴:警惕软件复杂度困局
对于大型的软件系统如互联网分布式应用或企业级软件,为何我们常常会陷入复杂度陷阱?如何识别复杂度增长的因素?在代码开发以及演进的过程中需要遵循哪些原则?本文将分享阿里研究员谷朴关于软件复杂度的思考:什么是复杂度、复杂度是如何产生的以及解决的思路。较长,同学们可收藏后再看。
阿里研究员谷朴:警惕软件复杂度困局
|
监控 数据可视化 数据安全/隐私保护
大大提高效率但是不火的5款软件
乐人之乐,人亦乐其乐,一天分享一些软件给大家,心情都变好许多。
104 0
大大提高效率但是不火的5款软件
|
安全 Java C++
消灭“脑细胞杀手”,阿里专家带你深入C++对象的生命周期管理
C/C++的指针一直是令人又爱又恨的特性。围绕指针产生了许许多多优雅的数据结构和系统实现,但又滋生了不少“脑细胞杀手”——内存Bug。如何通过指针管理C++中对象,如何管理对象的生命周期呢?本文中,阿里巴巴高级开发工程师付哲就为大家分享《C++对象的生命周期管理》。
5768 0
|
分布式计算 Java Hadoop
经常抱怨在公司学不到技术,学的技术没有使用场景怎么破?
经常抱怨在公司学不到技术,学的技术没有使用场景怎么破?
134 0
|
安全 物联网
鸿达公司高效复工稳产 秘密全在这里了
目前,有序复工稳产成为制造业企业的头等大事。阿里云工业互联网平台联合钉钉,共同推出制造业防疫复工生产管理方案,包括返岗人员近期健康记录、防疫物资准备、防疫组织及预案建立、生产场地设备消毒等等,帮助企业复工生产管理效率提升50%以上。同时,阿里云工业IoT设备管理产品在疫情期间免费使用。
193 12
鸿达公司高效复工稳产 秘密全在这里了
|
运维 程序员 Android开发
程序人生 - 30多岁程序员选什么样的公司可以稳妥地把技术路线走下去?
程序人生 - 30多岁程序员选什么样的公司可以稳妥地把技术路线走下去?
163 0
程序人生 - 30多岁程序员选什么样的公司可以稳妥地把技术路线走下去?
|
存储 Unix 程序员
程序员的自白:我如何让失败项目起死回生,变成价值 270 亿美元的应用程序?
Slack 是颇受欢迎的企业沟通和协作工具,目前有 63 万企业在使用。2014 年初拿到了 4000 多万美元融资之后又完成 1.2 亿美元的融资,其估值达到了 11.2 亿美元。2015 年 2 月,slack 成立一周年日活跃用户就达到 50 万人。2019 年 6 月 20 日,创业公司 Slack 正式登陆纽交所。 这个应用起源于一个几乎已经宣告失败的游戏项目,发展成今天一家价值 270 亿美元的公司实属不易。今天,我们来听听 Flicr 与 Slack 的联合创始人 Stewart Butterfield 的轶闻趣事。
141 0
程序员的自白:我如何让失败项目起死回生,变成价值 270 亿美元的应用程序?
|
人工智能 数据可视化 安全
开工推迟,多国封锁边境,疫情期如何做好远程开发?
面对新冠病毒肺炎,我们人人都在家中难以出门,还是在家远程码代码吧。
163 0
开工推迟,多国封锁边境,疫情期如何做好远程开发?
|
传感器 机器学习/深度学习 自动驾驶
避免「特斯拉式」悲剧,需要长期研究和成熟技术
近日,一辆特斯拉 Model S 在自动驾驶模式下发生事故,导致驾驶员死亡,该事故引发了业界对自动驾驶技术的重新思考。特斯拉采用的是辅助驾驶系统,并不能实现完全自动驾驶,只能减轻驾驶员负担。而实现完全驾驶需要整合视觉系统、传感器、雷达、LiDAR 及多种传感技,这些就像是人类驾驶员的视觉和听觉,是实现自动驾驶的基础。
109 0
|
Kubernetes 架构师 Dubbo
阿里研究员:警惕软件复杂度困局
对于大型的软件系统如互联网分布式应用或企业级软件,为何我们常常会陷入复杂度陷阱?如何识别复杂度增长的因素?在代码开发以及演进的过程中需要遵循哪些原则?本文将分享阿里研究员谷朴关于软件复杂度的思考:什么是复杂度、复杂度是如何产生的以及解决的思路。较长,同学们可收藏后再看。
2800 0
阿里研究员:警惕软件复杂度困局