【面试题】如何设计一个高并发的系统?

每个行业都一样,人才都是分层次的,从事技术行业的程序员们更是如此,按照技术能力分为三六九等。

每个层次的人出去面试,面试官考察的方向是不一样的。

刚入职场的小白,会问你很多基础性的知识,有过几年经验的程序员,会问你相关的项目经历、架构设计。如果是行业有影响力的技术专家,不一定会问你技术,可能就跟你聊聊行业动态、技术发展趋势。

如果你出去面试,面试官问你,如何设计一个高并发的系统?

那么你就得好好回答了,为什么?

如果你确实在互联网公司干过高并发系统,经历过每天几亿几十亿的流量,高峰期每秒几万甚至几十万的并发的话,面试官肯定不会问你如何设计一个高并发系统。而是会让你介绍下你们的项目,你们项目架构是什么样的?怎么部署的?部署了多少台机器?缓存怎么用的?数据库怎么用的?就是深挖细节,你到底是如何抗下高并发的。

如果面试官问你如何设计一个高并发系统,一定是你没实际干过高并发系统。面试官看你简历没什么亮点,又有几年工作经验,所以给你一个开放式的设计题,通过这个题目,了解你虽然没有实际干过高并发系统,但有没有自己研究学习过,有没有相关的知识积累。

面试官当然是希望招个真正干过高并发的人了,但这种人很难招,所以只能退而求其次,招一个没有实际经验但有相关知识积累的人。

所以此时,你必须展示出你所有关于高并发的知识了!

这种问题呢,最好不要一上来就给出最终的一套完备的高并发系统架构,而是不断地演进,正常的系统架构升级也是这么个过程。

比如,最开始时每秒最多10个请求,一个单体系统就可以抗住。

c981031e992f1f48e1fbf45b406b163c.png

图1 单体系统

接下来10w个用户变成100w,1000w个用户,每秒1000个请求,你线上机器内存开始开始感觉到紧张,使用率开始上升,cup使用率飙升。你数据库可能就扛不住了,因为数据库磁盘io效率开始下降,很多SQL变得很慢。

这个时候你要干的第一件事情就是系统拆分,把之前的单体系统拆分成多个系统,数据库也跟随系统做拆分,每个系统使用自己的数据库。

fb908fbec174bddaa4ef36fac329d07c.png

图2 系统拆分

单体系统拆分成立3个系统,每个系统访问自己独立的数据库,每个数据库部署在独立的机器上。原来一个数据库最多可以抗1000的并发,现在所有的资源翻了三倍,可以抗3000的并发。

假设现在系统每秒又3000个请求了,你系统可能又快扛不住了,这时候你怎么办呢?用缓存。

redis缓存可以轻松的抗几万的并发,用缓存后呢,大量的读请求可以走缓存,很多系统都是读多写少,比如资讯系统,3000个并发请求,缓存至少拦截掉2000个读请求,剩下1000个写请求走数据库。

6891ec2bfc6cae0acfd4354392f77c9e.png

图3 增加缓存

假设现在用户增长到1亿用户,每秒钟1w请求,写请求达到2000个,数据库又扛不住了,怎么办呢,可以在数据库前面加个MQ。

9d7da043bb188914840a12cba2b4126b.png

图4 增加MQ

这里MQ主要起到削峰的作用,高峰期大量的写请求积压在MQ中,等高峰期过了,再慢慢消费。

接下来用户增长到2亿,每秒2w个请求,4000个写请求。MQ就会积压非常多的消息,导致很多数据很久都不能被修改掉,这是用户不能忍受的。

单库写已经达到瓶颈了,怎么办,分库分表啊。你可以把一台数据库拆分为3台数据库,用多个数据库分摊写请求压力。

b6a99646f009307b3601ada3cea032af.png

图5 分库分表

缓存有过期的可能,如果请求访问的时候,缓存刚好过期了,就会导致读请求直接穿透到数据库里,所以你还可以给数据库加上读写分离,让读请求分流到从库去,降低对主库的压力。

6ebec40a03203ac876f773d9628893ce.png

图6 读写分离

针对搜索的话,数据量小的时候,可以走数据库,当数据量大了后,可以把相关的数据抽出来放到es集群里,es集群专门提供查询服务。

es集群是分布式的,可以放几十亿的数据,可以针对系统的数据量和搜索并发,配置合适数量的机器。

445b2c5b4f0df4d47df1e5601dc7e788.png

图7 es搜索

总之,就是随着用户量和并发量的不断增长,系统的架构也在不断地演进。上面这种架构演进还是比较简单的,真正复杂业务系统里,并不是简单的堆一些高大上的技术或框架,其系统远远比上面的系统复杂几十倍。

如果面试的时候,面试官问你如何设计一个高并发系统,你可以按照上面这个思路回答。虽然你可能没经历过高并发系统,但本文如果能让大家对这个问题多一些思考,在面试的时候,有一些系统性的思路和阐述,那么也就达到本文的目的了。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值