这篇文章对很多没有高并发经验的程序员来说,会非常有帮助。
很多程序员可能都遇到过类似的困惑:
我没有高并发项目经验,但是面试的时候经常被问到高并发、性能调优方面的问题,该怎么办?
今天给大家说一自己学习高并发的方法。
你可以自己写一个小的电商项目,建议最简单的单体结构的电商项目即可。
从最简单的单体项目开始,然后按照以下三个阶段来学习高并发。
第一阶段
在高并发条件下,学习对单机性能进行优化。
用 Docker 容器先去运行电商项目,然后再用 jmeter、wrk 等工具去压测。
在压测期间,你会发现:由于系统每个模块不同,所以性能表现就不一样。
这是正常的,不同模块、不同产品对并发指标的要求本身想·是不一样的。例如,商品浏览和下订单,一个读为主,一个写为主。
基于这种情况,你最好要编写复杂的压测脚本,能自动实现不同模块的压测任务。
然后在这种不断地压测探测下,去探测问题,并且通过优化代码、JVM 去解决问题。
比如,解决误用 HashMap 导致死循环的问题。又比如,误用不带缓存的文件 IO 流氓,去读取文件的问题等等。
该程序和 JVM 优化完毕后,你可能又会发现数据库也存在问题。于是,你又要去研究如何优化数据库 SQL,如何对数据库分表等问题。
也是在这个阶段,你可能还会学到,缓存的必要性以及同步缓存数据状态的重要性等重要知识点。
在搞了单机优化后,没有办法再通过单机的压测学到什么新的东西了。于是,转向第二阶段。
第二阶段
从阿里云买了两台机器,开始尝试使用负载均衡去分担高并发的压力。
同样的,也是借助压测工具去模拟了高并发。在压测期间,负载均衡和系统屡屡出现和单机完全不一样的问题。
比如,负载均衡本身的性能问题。比如,在一些时候,负载均衡后面的机器负载是不平衡的,需要对负载算法进行调整。
这个阶段,你会接触到负载均衡中大部分的细节。
但是,高并发中,很多系统的构成会很复杂,以至于需要分布式架构系统的程度。他们需要各种中间件做通信,做存储。
所以,继续第三阶段的练习。
第三阶段
为了能熟悉市面上各种中间件的使用,开始对单体的电商平台进行改造。
比如,把一些本地调用的方法,替换成 Dubbo 远程调用。
比如,将一些模块直接调用,替换成 MQ 中间件传消息。
再比如,一些放在关系数据库的被频繁访问的数据,改存在 MongoDB 中……
当然,压测依然继续。就这样,你可以实践到很多中间件和分布式框架的使用。
在模拟高并发练习的同时,别忘了去读各种高并发高性能的书籍。比如,《大型网站服务器容量规划》、《互联网创业核心技术:构建可伸缩的web应用》等书籍。
三个阶段的学习之后,面试的大部分基础问题你基本可以应付了。
毕竟在程序员这个圈子里,90% 以上的人可能都没有真正的高并发经验。作为面试官来说:
为什么我们需要找有高并发经验的人?
说白了,我们想找的程序员其实就是:
- 不会乱写性能很差的代码
- 能敏锐地感知到影响系统的问题
- 能独立的处理由于高并发引发的问题
我们找熟悉高可用的人,其实并不要求这个人一定能给出什么独特的高可用方案。我们要求的是,他能知道高可用的知识后,去意识到高可用的重要性。
比如限流功能出现问题,他要能马上认识到这是个很重要的问题,从而把解决的优先级提到很高。
通过以上三个阶段的学习和练习,基本是可以掌握这些技能的,这就够了,剩下的细节,就靠在实际工作再实践吧。
此外也希望各位面试官,在招人的时候,如果遇到好苗子可以适当宽容一些,给新人们一点机会。