架构设计⾯试题(史上最全、持续更新、吐⾎推荐)
⽂章很长,建议收藏起来,慢慢读! 奉献给⼤家:
经典图书 - ⾯试必备 + ⼤⼚必备 + 涨薪必备
经典图书 - ⾯试必备 + ⼤⼚必备 + 涨薪必备
社资源 -
⽂章⽬录
价值连城:2021春招⽉薪过5万⾯试题系列
搞定下⾯这些⾯试题,2021春招⽉薪过5万(猛!)阿⾥、京东、美团、头条… 随意挑、横着⾛
Java基础
苹果笔记本怎么下拉滚动条1: JVM⾯试题(史上最强、持续更新、吐⾎推荐)
2:Java基础⾯试题(史上最全、持续更新、吐⾎推荐)
3:死锁⾯试题(史上最强、持续更新)[wwwblogs/crazymakercircle/p/14323919.html] 4:设计模式⾯试题 (史上最全、持续更新、吐⾎推荐)
5:架构设计⾯试题 (史上最全、持续更新、吐⾎推荐)
还有 10 ⼏篇 篇价值连城 的⾯试题具体… 请参见【 】
万字长⽂:疯狂创客圈 springCloud ⾼并发系列
springCloud ⾼质量 博⽂
还有 10 ⼏篇 万字长⽂ 的⾼质量 博⽂具体… 请参见【 】
2021春招⽉薪过5万(猛!惊!)⾯试题之:架构设计篇
场景题
整理了⼀些常见的架构设计⾯试题,主要记录关键点,具体细节就不详细叙述了,案例慢慢补充。⽬前想起以下问题:
秒杀系统
短链接⽣成
编程猫如何制作植物大战僵尸⾼并发的红包系统
分布式ID⽣成
分布式限流
分布式定时任务
新浪微博怎么推送微博
⼤⽂件有限内存排序
秒杀系统
秒杀系统基本⾯试被问烂了,⽹上资料也很多,基本整理了内容如下:
设计难点:并发量⼤,应⽤、数据库都承受不了。另外难控制超卖。
设计要点:
将请求尽量拦截在系统上游,html尽量静态化,部署到cdn上⾯。按钮及时设置为不可⽤,禁⽌⽤户重复提交请求。
设置页⾯缓存,针对同⼀个页⾯和uid⼀段时间内返回缓存页⾯。
数据⽤缓存抗,不直接落到数据库。
读数据的时候不做强⼀致性教研,写数据的时候再做。
mysql面试题初级在每台物理机上也缓存商品信息等等变动不⼤的相关的数据
像商品中的标题和描述这些本⾝不变的会在秒杀开始之前全量推送到秒杀机器上并⼀直缓存直到秒杀结束。
像库存这种动态数据会采⽤被动失效的⽅式缓存⼀定时间(⼀般是数秒),失效后再去Tair缓存拉取最新的数据。
如果允许的话,⽤异步的模式,等缓存都落库之后再返回结果。
如果允许的话,增加答题教研等验证措施。
其他业务和技术保障措施:
业务隔离。把秒杀做成⼀种营销活动,卖家要参加秒杀这种营销活动需要单独报名,从技术上来说,卖家报名后对我们来说就是已知热点,当真正开始时我们可以提前做好预热。
系统隔离。系统隔离更多是运⾏时的隔离,可以通过分组部署的⽅式和另外 99% 分开。秒杀还申请了单独的域名,⽬的也是让请求落到不同的集中。
数据隔离。秒杀所调⽤的数据⼤部分都是热数据,⽐如会启⽤单独 cache 集或 MySQL 数据库来放热点数据,⽬前也是不想0.01%的数据影响另外99.99%。
另外需要复习缓存穿透、雪崩等等问题,主要的流量都落在了缓存数据库上,需要针对缓存数据库的⾼可⽤作保障。
短链接⽣成
这个应该是⽐较公认的⽅案了:ahrefs英文发音
1. 分布式ID⽣成器产⽣ID
2. ID转62进制字符串
3. 记录数据库,根据业务要求确定过期时间,可以保留部分永久链接
主要难点在于分布式ID⽣成。鉴于短链⼀般没有严格递增的需求,可以使⽤预先分发⼀个号段,然后⽣成的⽅式。
看了下新浪微博的短链接,8位,理论上可以保存超过200万亿对关系,具体怎么存储的还有待研究。
红包系统
红包系统其实很像秒杀系统,只不过同⼀个秒杀的总量不⼤,但是全局的并发量⾮常⼤,⽐如春晚可能⼏百万⼈同时抢红包。
主要技术难点也类似,主要在数据库,减库存的时候会抢锁。另外由于业务需求不同,没办法异步,也不能超卖,事务更加严格。
不能采⽤的⽅式:
乐观锁:⼿慢会失败,DB ⾯临更⼤压⼒,所以不能采⽤。
直接⽤缓存顶,涉及到钱,⼀旦缓存挂掉就完了。
建议的⽅式:
接⼊层垂直切分,根据红包ID,发红包、抢红包、拆红包、查详情详情等等都在同⼀台机器上处理,互不影响,分⽽治之。
请求进⾏排队,到数据库的时候是串⾏的,就不涉及抢锁的问题了。
为了防⽌队列太长过载导致队列被降级,直接打到数据库上,所以数据库前⾯再加上⼀个缓存,⽤CAS⾃增控制并发,太⾼的并发直接返回失败。
红包冷热数据分离,按时间分表。
分布式ID
分布式ID⽣成⼤概也算⽼⽣常谈的问题了,主要关键在于是否需要严格递增,严格递增的话效率必然⼤降。
不需要递增的话⽐较简单:
⼀种⽅式是预先分⽚,⽐如⼗台机器,每台先分⼀千个ID,⼀号机从0开始,⼆号从1000开始等等。缺点是⼤致上可以被⼈看出来业务量。
另⼀种⽅式是类似雪花算法,每个机器有个id,然后基于时间算⼀个id,再加上⼀个递增id。⽐如如下美团的⽅案。缺点是机器的时间戳不能回拨,回拨的话会出现问题。
如果要求严格递增,我没到现成的很好的⽅案,⼤概只能单机⽣成,不能分布式了,然后都去单机上取号。效率的话,类似Redis的数据库⼤概能到每秒⼗⼏⼆⼗⼏万的速度。
分布式限流
常见的限流⽅法:
固定窗⼝计数器:按照时间段划分窗⼝,有⼀次请求就+1,最为简单的算法,但这个算法有时会让通过请求量允许为限制的两倍。
滑动窗⼝计数器:通过将窗⼝再细分,并且按照时间“滑动”来解决突破限制的问题,但是时间区间的精度越⾼,算法所需的空间容量就越⼤。
漏桶:请求类似⽔滴,先放到桶⾥,服务的提供⽅则按照固定的速率从桶⾥⾯取出请求并执⾏。缺陷也很明显,当短时间内有⼤量的突发请求时,即便此时服务器没有任何负载,每个请求也都得在队列中等待⼀段时间才能被响应。
令牌桶:往桶⾥⾯发放令牌,每个请求过来之后拿⾛⼀个令牌,然后只处理有令牌的请求。令牌桶满了则多余的令牌会直接丢弃。令牌桶算法既能够将所有的请求平均分布到时间区间内,⼜能接受服务器能够承受范围内的突发请求,因此是⽬前使⽤较为⼴泛的⼀种限流算法。
Google 的开源项⽬ guava 提供了 RateLimiter 类,实现了单点的令牌桶限流。
分布式环境下,可以考虑⽤ Redis+Lua 脚本实现令牌桶。
如果请求量太⼤了,Redis 也撑不住怎么办?我觉得可以类似于分布式 ID 的处理⽅式,Redis 前⾯在增加预处理,⽐如每台及其预先申请⼀部分令牌,只有令牌⽤完之后才去 Redis。如果还是太⼤,是否可以垂直切分?按照流量的来源,⽐如地理位置、IP 之类的再拆开。
分布式定时任务
任务轮询或任务轮询+抢占排队⽅案
每个服务器⾸次启动时加⼊队列;
每次任务运⾏⾸先判断⾃⼰是否是当前可运⾏任务,如果是便运⾏;
如果不是当前运⾏的任务,检查⾃⼰是否在队列中,如果在,便退出,如果不在队列中,进⼊队列。
微博推送
主要难点:关系复杂,数据量⼤。⼀个⼈可以关注⾮常多的⽤户,⼀个⼤ V 也有可能有⼏千万的粉丝。
先介绍最基本的⽅案:
1. 推模式:推模式就是,⽤户A关注了⽤户 B,⽤户 B 每发送⼀个动态,后台遍历⽤户B的粉丝,往他们粉丝的 feed ⾥⾯推送⼀条动
态。
2. 拉模式:推模式相反,拉模式则是,⽤户每次刷新 feed 第⼀页,都去遍历关注的⼈,把最新的动态拉取回来。
⼀般采⽤推拉结合的⽅式,⽤户发送状态之后,先推送给粉丝⾥⾯在线的⽤户,然后不在线的那部分等到上线的时候再来拉取。
另外冷热数据分离,⽤户关系在缓存⾥⾯可以设置⼀个过期时间,⽐如七天。七天没上线的可能就很少⽤这个 APP。
⼤⽂件排序
对于远⾼于内存的⽂件排序。
外归并排序:
对⽂件分割,然后分别排序
频率分布直方图求中位数排好序的⽂件依次读取⼀个缓冲区的⼤⼩,然后进⾏排序,输出到输出缓冲区,然后保存到结果⽂件。
如果是数字,可以⽤位图排序,但是要求⽐较苛刻:
数字不重复
知道最⼤值
相对密集,因为没出现的数字也会占⽤空间
⽐较适合电话号之类的。
其他场景题
1、情景题:如果⼀个外卖配送单⼦要发布,现在有200个骑⼿都想要接这⼀单,如何保证只有⼀个骑⼿接到单⼦?
这个可以⽤redis的lpush rpop来实现。
2、场景题:美团⾸页每天会从10000个商家⾥⾯推荐50个商家置顶,每个商家有⼀个权值,你如何来推荐?第⼆天怎么更新推荐的商家?
这个可以⽤堆排,第⼆天更新推荐的可以在要更新之前的时候在redis做计算操作,然后放数据库做个同步就⾏了。
3、场景题:抢红包问题
悲观锁,乐观锁,存储过程放在mysql数据库中。
4、场景题:1000个任务,分给10个⼈做,你怎么分配,先在纸上写个最简单的版本,然后优化。
全局队列,把1000任务放在⼀个队列⾥⾯,然后每个⼈都是取,完成任务。
unix个人系统分为10个队列,每个⼈分别到⾃⼰对应的队列中去取务。
5、场景题:保证发送消息的有序性,消息处理的有序性。
给消息加⼀个header,识别⼀下header的syn就⾏
6、如何把⼀个⽂件快速下发到100w个服务器
边下发,边复制
7、给每个组分配不同的IP段,怎么设计⼀种结构使的快速得知IP是哪个组的?
8、10亿个数,出最⼤的10个。
建议⼀个⼤⼩为10的⼩根堆。
9、有⼏台机器存储着⼏亿淘宝搜索⽇志,你只有⼀台2g的电脑,怎么选出搜索热度最⾼的⼗个搜索关键词?
分bucket,每个bucket出频次最⾼的10个,总体⽤分治算法做。
10、分布式集中如何保证线程安全?
分布式锁,意在让分布式多线程的环境针对⼀个共享资源⼀次性只会有⼀个线程获取到锁⾥的资源。分布式锁的实现⼀般就是redis和zk居多。redis设置⼀下expire time就⾏。
11、10万个数,输出从⼩到⼤?
先划分成多个⼩⽂件,送进内存排序,然后再采⽤多路归并排序。
12、有⼗万个单词,出重复次数最⾼⼗个?
map<String,Integer> 字符串,频次,然后堆排。
场景题答题⼩建议:
架构设计题⽬远不⽌这些,我觉得主要从以下⼏个⽅⾯准备:
先了解常⽤算法,针对解决各种问题能⽤哪些算法,⽐如⼤⽂件排序⽤外排序,⼤量数据中的命中判断⽤位图/布隆过滤器等等。
注意扩展性、多考虑极端情况,多问⾃⼰⼏个为什么。⽐如说起单机的限流算法想想分布式的怎么做。
实在不知道怎么弄的叙述⾃⼰的思考过程,着重展⽰⾃⼰考虑周全、思维缜密。
⽐如之前⼀个同事⾯阿⾥被问整个机房⽹络挂了/断电了之类的极端问题,相信很多⼈不可能真的遇到这种情况,⽽且可⽤性⼀般也到不了这个级别。如果是我的话,我会着重考虑数据⼀致性、数据恢复、脏数据处理之类的问题,是否有其他机房提供服务,如果有的话涉及到⽹络分区,是不是可以引申谈谈 zab、raft 算法,另外原本两个或者三个机房提供服务,现在瞬间少了⼀个,其他机房的负载瞬间上升,怎么做削峰、降级,这就有回到我们会的问题上了。另外等到⽹络恢复了,怎么恢复服务?之前处理到⼀半的数据怎么处理?这些引申开来都有太多可以聊。
分布式微服务架构
问1.什么是分布式系统
分布式系统的⽬标与要素
分布式系统的⽬标是提升系统的整体性能和吞吐量另外还要尽量保证分布式系统的容错性(假如增加10台服务器才达到单机运⾏效果2倍左右的性能,那么这个分布式系统就根本没有存在的意义)。
即使采⽤了分布式系统,我们也要尽⼒运⽤并发编程、⾼性能⽹络框架等等⼿段提升单机上的程序性能。
分布式系统设计两⼤思路:中⼼化和去中⼼化

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。