公司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程序员节快乐,我是鱼仔,我们下期再见。



相关文章
|
3月前
|
传感器 安全 文件存储
CrowdStrike更新导致全球Windows系统大规模崩溃,CEO致歉并详解修复措施
CrowdStrike更新导致全球Windows系统大规模崩溃,CEO致歉并详解修复措施
CrowdStrike更新导致全球Windows系统大规模崩溃,CEO致歉并详解修复措施
|
6月前
|
人工智能 数据安全/隐私保护
意外之喜!5款小巧工具助你轻松面对繁忙生活
在繁忙的日常中,简单而巧妙的小工具能够带来意外的惊喜。这五款工具或许正是你所需要的,不妨一试。
55 1
|
监控 Linux 开发者
国产操作系统统信UOS的简单故障维护,系统崩溃小妙招
国产操作系统统信UOS的简单故障维护,系统崩溃小妙招
国产操作系统统信UOS的简单故障维护,系统崩溃小妙招
|
分布式计算 Java Hadoop
经常抱怨在公司学不到技术,学的技术没有使用场景怎么破?
经常抱怨在公司学不到技术,学的技术没有使用场景怎么破?
131 0
|
安全 物联网
鸿达公司高效复工稳产 秘密全在这里了
目前,有序复工稳产成为制造业企业的头等大事。阿里云工业互联网平台联合钉钉,共同推出制造业防疫复工生产管理方案,包括返岗人员近期健康记录、防疫物资准备、防疫组织及预案建立、生产场地设备消毒等等,帮助企业复工生产管理效率提升50%以上。同时,阿里云工业IoT设备管理产品在疫情期间免费使用。
189 12
鸿达公司高效复工稳产 秘密全在这里了
|
运维 程序员 Android开发
程序人生 - 30多岁程序员选什么样的公司可以稳妥地把技术路线走下去?
程序人生 - 30多岁程序员选什么样的公司可以稳妥地把技术路线走下去?
160 0
程序人生 - 30多岁程序员选什么样的公司可以稳妥地把技术路线走下去?
|
人工智能 数据可视化 安全
开工推迟,多国封锁边境,疫情期如何做好远程开发?
面对新冠病毒肺炎,我们人人都在家中难以出门,还是在家远程码代码吧。
157 0
开工推迟,多国封锁边境,疫情期如何做好远程开发?
|
消息中间件 运维 架构师
大公司和小公司的程序员有什么差别?如何进大公司?
  我在大公司干活前,基本都在小公司之间辗转,对比两种公司的经历,切身感受到“人往高处走“绝非是空话。我在之前的博文里,多次讲到程序员该去大厂看看,在这篇博文里,将结合我和我朋友的所见所闻,从技术和发展前景等方面,综合讲述小公司和大公司里程序员的普遍差别,以此再让大家感受下大公司经历的重要性。不过本文不是停留于此,还更将针对小公司干杂事的程序员,给出逆袭到大厂的若干建议,好正文开始。
212 0
|
区块链 人工智能
区块链有望成遏制财务造假利器,“顺便”抢走500万财会工作机会
A股上市公司财务造假现象屡见不鲜。从今年年中的康美药业到最近爆出的欢瑞世纪,多家公司因财务造假,遭证监会重罚、造成股价暴跌。是否有技术手段可以从源头扼杀财务造假?区块链技术或是一条途径。
|
安全
各种安全问题(杂)
StringBuilder 的方法不是线程安全的 由于 StringBuilder 相较于 StringBuffer 有速度优势,所以多数情况下建议使用 StringBuilder 类。
1134 0