互联网公司经常面临“三高”问题:高并发、高性能、高可用。我们经常会收到一些同学的提问:我没有做高并发项目的经验,工作中也没有这种场景。但是面试的时候经常被问到高并发和性能调优的问题。有什么学习或解决的方法吗?这时候就需要你有全局的技术视野,熟悉一些常用的系统优化方法论,学习一些系统设计的解决方案。今天我们请来了淘宝部的3位技术工程师,给大家分享一些他们在高并发项目中的学习和实践经验以及面试答题心得,希望对大家有所帮助。01淘大科技部-产品技术-兆铭《高并发系统很难得,但其实可以通过压力测试来模拟。现实中,即使是大公司,高并发系统也很难得到。但是高并发其实是可以通过压力测试来模拟的。高并发的背后,核心是高可用和低延迟。所以我们其实是希望能够设计一个系统,在高并发访问的时候依然可用,响应速度不会变慢。想要提高高并发系统的设计和开发能力,有两个方面:系统学习相关理论;找到目标系统并不断寻找提高其性能的方法。前者是后者的理论基础。如果想从事高并发系统开发岗位,需要学习很多相关技术。这些技术的核心是解决如何在高并发情况下保持系统的高可用和低延迟。以Java工程师为例,互联网程序员面试中经常考察的内容包括:架构设计的高可用和稳定性、事务一致性、多副本一致性、CAP理论。相关技术多线程(JUC/AQS/线程池)、RPC调用和框架(如Thrift)、NIO和NIO框架(如Netty)、高并发框架(如Disruptor)、微服务框架(SpringBoot)、微服务治理(SpringCloud)、数据库相关技术(如索引优化、分库分表、读写分离)、分布式缓存(如redis)、消息中间件系统(如RabbitMQ)、容器技术(如docker).工具系统性能检查(top、uptime、vmstat、iostat)、压力测试工具(如ab、locust、Jmeter、go)、线程分析(如jps、jstack)等。当然,一开始,我们不可能将这些技能一一掌握。我们可以从一个实际的项目入手,不断的应用这些技术,找出知识的不足,然后补充相关的知识。“如何设计一个好的秒杀系统”想必是各大互联网公司面试中被问到最多的问题之一。所以通过设计秒杀系统来开始练习是一个不错的选择。秒杀系统的特点:瞬时并发量大秒杀期间,大量用户会同时抢购,瞬时并发访问量会突然增加10倍,甚至100倍以上。库存低一般情况下,闪购活动的商品数量很少,导致只有极少数用户能够成功购买。简单业务流程比较简单,一般是下单,扣库存,下单付款。秒杀系统限流设计要点由于活动的存量一般很小,只有少数用户能够秒杀成功。所以我们需要限制大部分的用户流量,只允许少量的用户流量进入后台服务器。秒杀启动的瞬间,会有大量的用户涌入,所以一开始会出现一个瞬间的流量高峰。如何让瞬时流量高峰更平滑是秒杀系统设计成功的关键因素。实现流量削峰填谷一般采用缓存和MQ中间件来解决。异步秒杀其实可以当作高并发系统来处理。这时候可以考虑做业务兼容,将同步业务设计成异步处理任务,提高网站的整体易用性。缓存秒杀系统的瓶颈主要体现在下单和扣库存的过程中。这些流程主要用到OLTP数据库,比如MySQL、Oracle。由于数据库底层采用B+树的存储结构,随机读写效率比较低。如果我们将部分业务逻辑迁移到内存缓存或者Redis中,并发效率会大大提高。从0到1搭建一个秒杀系统并不容易,涉及到很多前端、后端、中间件技术。这其实是所有公司的常态。大部分时间都花在摆架子上了。没有太多时间进行真正的技术优化。往往是业务量突然大增或者大促活动来临时,一波性能优化。所以,如果没有实际的高并发项目可以做,搞个秒杀系统自娱自乐也不错。搭建系统->压力测试->发现问题->学习知识->优化系统。通过这个循环,相信你不仅会体会到学习的乐趣,实力也会得到极大的提升。02淘系技术部-行业与智能化运营架构组-2月《面试时被问到高并发经验不要慌,可以按照以下流程表达自己的高并发设计能力:优化耗时提高单机并发能力,提高整体并发能力。”个人觉得严格意义上的高并发体验是不需要去追求的,因为很多时候你并没有这样的机会,高并发处理体验主要体现在日常的积累上。以及对自己的严格要求上.为什么老是说高并发,在并发不高的场景下,经验丰富的人都可以完成基本的业务开发,没有任何性能问题,下游依赖和底层存储依赖不会影响你的系统,但是在并发高的时候,一切都变了,可能是下游在高并发环境下抖动了几毫秒,由于备库写高或者读压力过大导致db延迟,你的系统或者业务会受到影响。故障。怎么办积累“经验”?针对这个问题,我总结了三点可以实施的:系统设计优化第一,系统一定要stat除非不断横向扩展,支持流量变化。业务层的高并发大部分需要不断的扩容来支撑,但扩容也不是最根本的方式。如果系统没有优化,扩容很可能一开始就见效。过了某个阶段,情况会开始恶化,因为底层的依赖竞争变得激烈,失败开始增加。优化的终点往往是下游依赖和底层数据层的优化。解决方案大多是常见的缓存分层、读写分离、分库分表、异步化等,但是在引入这些技术方案的时候,会带来一些副作用,接下来需要解决和阻断这些副作用.业务逻辑优化当你只负责一个低流量的系统时,高并发就没有机会了吗?实际上,你需要不断严格要求自己,才能让业务跑得更快,例如:将单个请求的响应时间从100ms优化到20ms;单机容量从100qps增加到500qps,同时cpu消耗增加不明显;优化单个请求,降低请求对cache和db的放大系数,减轻cache和db的压力。在这个过程中,你会积累很多实践经验。完成业务开发很容易,但要完成高效、高扩展性的业务开发却很难。多往前想几步,收获会很多。压测验证只能在业务量不高并发的情况下通过人为造流量来验证(但前提是你的系统支持全链路压测,否则压测数据会污染真实线上环境。如果不暂时支持,那么恭喜你,有机会做全链路压测改造),通过验证目标水位下的系统性能和机器性能,继续重复前面两个过程,不断迭代直到细节不能扣分来提升性能;如何展现你的高并发体验?只要在日常的研发过程中严格自律,做好各种设计和优化,不要随意编写难于扩展和维护的代码,面试的时候聊聊就可以了。面试的时候被问到高并发经验不要慌。只需按照以下流程来表达你的高并发设计能力:如何优化单个请求的耗时这里会讲解如何设计和改造系统架构,其中可能会涉及到jvm参数优化,如何选择各种依赖,以及你在这个过程中积累了哪些选择和优化方法;如何提升单机并发能力这里将针对您的业务中单机并发能力受限的重点进行阐述,这里主要的挑战是单机的约束和单机资源的竞争。你是如何设计和克服它们的,你在这个过程中积累了哪些设计原则?如何提升整体的并发能力这里给大家讲解集群环境中最重要的亮点,就是如何处理跨机资源竞争和数据一致性问题,这会体现你整体的业务架构设计能力;综上所述,面试时并不要求你有真正的高并发项目经验,项目经验只是为了验证你是否真的做了一些设计和优化。如果你能把高并发场景下的设计原则、可能出现的问题场景和解决方案表达清楚,那么相信面试官也会认可的。03淘溪技术部-淘溪基础设施-螺鸡》对于高并发系统的设计,个人建议可以从下往上分为三个部分。首先是建立基础知识体系,其次是熟悉行业解决方案,以及最终分布式系统设计。首先,高并发系统并不是一开始就设计出来的,所有的解决方案都来自于业务场景,大部分都是针对特定时期的问题和挑战逐步演化出来的,即使是高并发公司的研发生场景如果不参与解决这些问题,往往无法直接获得高并发的经验积累,所以对于没有场景的公司里的研发同学来说,其实大家的出发点都是差不多的,根本就不需要伪装,关键是掌握核心技术,对于高并发系统设计,个人建议从下往上分为三个部分,首先是建立基础知识体系,其次是熟悉行业解决方案,最后是分布式系统设计。知识体系的建立需要更多关注底层,比如算法、缓存、多线程、并发、JVM、OS、网络、分布式理论等,这些东西比较稳定,基于这些的解决方案底层技术似乎层出不穷,各种缓存技术,各种消息队列,各种数据库。但是在掌握了底层原理之后,再看上层的解法,可以起到举一反三的效果。对于最终的分布式系统设计,就是针对具体的业务场景,应用相应的技术,组装成一个系统解决方案。知识网上已经有很多学习资料了,大家可以自己学习搭建系统。我公司没有具体的场景,就去各大公司的技术博客学习行业解决方案。行业解决方案的研究,建议多思考原因(Why),这是系统设计的核心。例如,如果链接被删除,会对系统产生什么样的影响?改用另一种技术会有什么不同?下面主要说一下面试中系统设计的答题思路。第一步是提取设计目标。在分布式系统的设计中,一定要明确自己的设计目标,比如系统延迟、吞吐量等。有时它们不兼容,会直接影响具体的技术选择。如果您在面试期间没有实际项目也没关系。你可以针对一个假设的业务场景,提炼出系统设计的假设,多和面试官交流,说明清楚你是基于什么样的需求来做这个设计的。第二步是核心模块设计。下一步是对系统建模以及需要哪些核心模块。该阶段主要关注功能的满足,如核心算法选择、数据模型设计等。第三步,展开设计,找出系统的瓶颈点,结合需要达到的系统指标。对系统进行合理分层,选择常用的扩展技术,如:负载均衡水平扩展缓存数据分片最后,高并发系统的设计是一个负责任的系统工程。目标不仅是关注性能,而且实际上是同时关注高可用性和可扩展性。因此,在实际方案的设计中,除了要考虑在正常情况下能否达到性能指标外,还需要考虑系统在各种异常情况下能否处于可控状态。互联网业务正处于快速迭代发展的过程中,需要保证在未来的场景中有足够的演进空间。如上,我们在日常工作和面试经历中可能无法真正体验到高并发系统,但我们还是有多种学习和实践的方式来获得类似的体验。如果能够尝试去学习和理解高并发场景下的设计原则,以及可能出现的问题场景和解决方案,那么在实际遇到高并发项目的时候,效果会事半功倍。希望以上分享对大家有所帮助。一起来~
