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