当前位置:网站首页>Every day we say we need to do performance optimization. What are we optimizing?
Every day we say we need to do performance optimization. What are we optimizing?
2020-11-06 01:15:00 【Yin Jihuan】
During the interview, I am often asked about :
- Have you ever done performance optimization ?
- What aspects have been optimized ?
- How to optimize ?
- What is the effect of optimization ?
The serial gun asked , For old drivers who have done optimization , It must be able to resist . For Xiaobai, who has not really done optimization , I'm sure I can't bear this series of questions , In the end, the interview failed .
So what exactly is performance optimization optimizing ? Let's take a look at some common optimization methods .
SQL Optimize
When the response time of your developed interface exceeds 200ms When it comes to optimization , Of course 200ms It's not absolute , It depends on the application scenario . With App give an example , Call in a page 5 Interface ( Digression : You can also do aggregation ), So the total is 1s Time for , For users, the experience is OK , Of course, the faster the response, the better .
The interface takes 200ms, One of the most important is the operation of the database , There will be... In an interface N Secondary database operation . So optimize SQL Speed priority is the highest , A lot of slow SQL It's going to take down the whole system .
About SQL Optimization of is not the focus of this article , Most of them are slow SQL It still has something to do with your usual habits of development . Most of them are writing SQL I don't think much about performance , Just write it out ,join I'll be with you , It doesn't comb the query fields , Do not add index , It's OK to start online , Wait until the concurrency amount , It's cool when it comes to data .
You can refer to this article about the use of database :https://mp.weixin.qq.com/s/mFsK7YSKcG6T7jpPnK92tg
When the amount of data is large, we must do read-write separation and sub database sub table , This is also the only way to optimize . Related articles can also refer to some of my previous writing :http://mp.weixin.qq.com/mp/homepage?__biz=MzIwMDY0Nzk2Mw==&hid=4&sn=1b96093ec951a5f997bdd3225e5f2fdf&scene=18#wechat_redirect
Reduce duplicate calls
Another fatal problem with poor performance is repeated calls , The same logic repeats database queries in different ways , Repeated calls to RPC Service etc. .
Consider the following code :
skuDao.querySkus(productId).stream().map(sku -> {
skuDao.getById(sku.getId());
})
It's clear that the data has been found , According to ID I went to check again , The more the number of , The more time you waste . This is just an example , I believe that there are a lot of duplicate queries in real projects , I wrote an article before , Explain how to solve this repeated query problem , Those who are interested can check this article :https://mp.weixin.qq.com/s/1k4OtNYIoOasrXAF1ZhcGg
Query on demand
A lot of business logic is not complex function , But the response was slow . It's often when you write code that you don't think about , Just call any existing method , Resulting in slower overall response , In summary : Most of the performance issues are written in code .
Say a scene , Everyone must have seen . The parameter is a commodity ID, The function is on the shelf , We need to judge the State , Only when you meet the requirements can it be put on the shelves . In this scenario, you just need to get the status of the goods to judge , Sometimes you see the code in the following way :
GoodsDetail goods = goodsService.detail(id);
if (goods.getStatus() == GoodsStatusEnum.XXXX) {
}
detail There's a lot of logic in , In addition to basic product information , There's a lot more , That's why it's slow .
Parallel call
For an interface , If you design to multiple interiors RPC Services or multiple external interfaces , When there is no association between interfaces , We can use parallel calls to improve performance .
CompletableFuture It is very suitable for parallel call scenarios , About CompletableFuture This article does not elaborate on the use of , do Java You have to be able to use .
except CompletableFuture outside , For the processing of set class , It can be used parallelStream To implement parallel calls .
In microservices, there is a layer dedicated to aggregation API, The aggregation layer is very suitable for parallel calls , A function or a page presentation involves multiple interfaces , Interface aggregation and data tailoring in the back end through aggregation layer , Respond to the front end together .
Cache on
Caching is also the most commonly used optimization , The effect is most obvious , The cost is not big either . For caching , And don't abuse , Not all scenarios can rely on heap caching to improve performance .
First of all, for business scenarios with low real-time requirements, cache can be used preferentially , And don't worry too much about updating , It's just natural .
Business scenarios with high real-time requirements , Cache must have a complete cache update mechanism , Otherwise, it is easy to cause inconsistency between business data and cache data .
The recommended approach is to subscribe to binlog To update the cache uniformly , Don't update or invalidate the cache in your code , The simple scene is OK , The entrance is just a few , No big problem . Some data is used in multiple scenarios , There are too many entries to update ,
Asynchronous processing
Some logic , Without real-time feedback to users, it can be handled in the background asynchronously .
The most common way of asynchronous processing is to add tasks to the thread pool for processing , Thread pool needs to consider the capacity and monitoring of some indicators , For related articles, please see my article :https://mp.weixin.qq.com/s/JM9idgFPZGkRAdCpw0NaKw
In addition to monitoring some indicators , Another problem to be concerned about is the persistence of tasks . If your data is already stored , Then read it out and execute it through the thread pool . If there is no persistence, it is directly dropped into the thread pool for execution , There is a possibility of loss , Such as service restart and so on .
About persistence , Whether it's a thread pool or EventBus such , Will meet , Therefore, for asynchronous scenarios, I suggest that you use message queues .
Message queuing can store task information , Guaranteed not to lose . The message in the queue is consumed separately for logical processing , If you want to speed up consumption , You can also use the thread pool for multithreading consumption on the consumer side of the queue , Multi thread consumption should also avoid message loss , You can check out my article :https://mp.weixin.qq.com/s/Bbh1GDpmkLhZhw5f0POJ2A
JVM Parameter adjustment
JVM Parameter adjustment , In general, we don't have to adjust . Sometimes some code is not written well , Causing memory overflow , At this time, I will make some adjustments and optimize the code .
Parameter adjustment is mainly to reduce GC The pause problem caused by , If your program is always GC, There's been a pause , Your interface is slow .
As long as there is no frequent Full GC, In optimizing this JVM You can adjust the parameters of , Give priority to SQL Optimize these .
With the machine
Adding machines is the ultimate trick , When concurrency goes up , How do you optimize single machine and single database to resist concurrency is also limited , At this time, it can only be expanded horizontally .
If it's an early start-up , And it's growing fast , Adding machines is the most direct way to optimize , Although the cost goes up , But developing resources is also a cost , Saving can achieve more business requirements . Wait until the mid-term is stable before considering the architecture , Overall optimization and refactoring of performance .
It's like playing a game , Only equipped players can be arrogant , The same is true for back-end applications , High configuration machine , High configuration database configuration , High configuration cache and so on .
About author : Yin Jihuan , Simple technology enthusiasts ,《Spring Cloud Microservices - Full stack technology and case analysis 》, 《Spring Cloud Microservices introduction Actual combat and advanced 》 author , official account Ape world Originator .
I have compiled a complete set of learning materials , Those who are interested can search through wechat 「 Ape world 」, Reply key 「 Learning materials 」 Get what I've sorted out Spring Cloud,Spring Cloud Alibaba,Sharding-JDBC Sub database and sub table , Task scheduling framework XXL-JOB,MongoDB, Reptiles and other related information .
版权声明
本文为[Yin Jihuan]所创,转载请带上原文链接,感谢
边栏推荐
- 文本去重的技术方案讨论(一)
- 通过深层神经网络生成音乐
- vite + ts 快速搭建 vue3 專案 以及介紹相關特性
- 6.8 multipartresolver file upload parser (in-depth analysis of SSM and project practice)
- 安装Anaconda3 后,怎样使用 Python 2.7?
- python jieba分词(结巴分词)、提取词,加载词,修改词频,定义词库
- 自然语言处理之分词、命名主体识别、词性、语法分析-stanfordcorenlp-NER(二)
- 企业数据库的选择通常由系统架构师主导决策 - thenewstack
- X Window System介紹
- 【C/C++ 1】Clion配置与运行C语言
猜你喜欢
随机推荐
7.2.2 compressing static resources through gzipresourceresolver
【jmeter】實現介面關聯的兩種方式:正則表示式提取器和json提取器
6.8 multipartresolver file upload parser (in-depth analysis of SSM and project practice)
技術總監,送給剛畢業的程式設計師們一句話——做好小事,才能成就大事
Network programming NiO: Bio and NiO
技術總監7年經驗,告訴大家,【拒絕】才是專業
PLC模拟量输入和数字量输入是什么
Clean架构能够解决哪些问题? - jbogard
DeepWalk模型的简介与优缺点
Asp.Net Core學習筆記:入門篇
面经手册 · 第12篇《面试官,ThreadLocal 你要这么问,我就挂了!》
Technical director, to just graduated programmers a word - do a good job in small things, can achieve great things
6.9.1 flashmapmanager initialization (flashmapmanager redirection Management) - SSM in depth analysis and project practice
A debate on whether flv should support hevc
How to demote a domain controller in Windows Server 2012 and later
连肝三个通宵,JVM77道高频面试题详细分析,就这?
【效能優化】納尼?記憶體又溢位了?!是時候總結一波了!!
6.9.2 session flashmapmanager redirection management
如何在Windows Server 2012及更高版本中將域控制器降級
JVM内存区域与垃圾回收