Skip to content

Latest commit

 

History

History
38 lines (33 loc) · 4.41 KB

system-design.md

File metadata and controls

38 lines (33 loc) · 4.41 KB
  • 你项目的并发是多少?怎么解决高并发问题?单机情况下Tomcat的并发大概是多少,MySQL的并发大致是多少?
  • 什么是C10K问题;
  • 高并发情况下怎么办?
  • 系统的量级、pv、uv等?
  • 如何防止表单重复提交(Token令牌环等方式)?
  • 有一个url白名单,需要使用正则表达式进行过滤,但是url量级很大,大概亿级,那么如何优化正则表达式?如何优化亿级的url匹配呢?
  • 扫描二维码登录的过程解析;
  • 怎么解决Hash冲突?(开放地址法、链地址法、再哈希法、建立公共溢出区等)
  • 写出一个必然会产生死锁的伪代码?
  • 秒杀系统设计,超卖怎么搞?
  • 你们的图片时怎么存储的,对应在数据库中时如何保存图片的信息的?
  • 假如成都没有一座消防站,现在问你要建立几座消防站,每个消防站要配多少名消防官兵,多少辆消防车,请你拿出一个方案;
  • 基于数组实现一个循环阻塞队列;
  • 常见的ipv4地址的展现形式如“168.0.0.1”,请实现ip地址和int类型的相互转换。(使用位移的方式)?
  • 现网某个服务部署在多台Liunx服务器上,其中一台突然出现CPU 100%的情况,而其他服务器正常,请列举可能导致这种情况发生的原因?如果您遇到这样的情况,应如何定位?内存?CPU?发布?debug?请求量?
  • 给定a、b两个文件,各存放50亿个url,每个url各占64字节,内存限制是4G,让你找出a、b文件共同的url?
  • 海量日志数据,提取出某日访问百度次数最多的那个IP;
  • 一个文本文件,大约有一万行,每行一个词,要求统计出其中最频繁出现的前10个词,请给出思想,给出时间复杂度分析。
  • 你目前为止遇到的最大数据量是多少?知道100万时候怎么设计吗?1000万呢?过几十亿呢?
  • 搭建高并发高可用系统需要怎样设计?考虑哪些东西,有多少说多少。
  • 你是怎么设计系统缓存的,为什么,什么场景;
  • 问下项目的系统构建,思考,为什么这样构建?
  • 你们系统的部署模型?
  • 前后端分离,如何防止接口被其他人调用或恶意重发?
首先,http协议的无状态特性决定了是无法彻底避免第三方调用你的后台服务。我们可以通过crsf、接口调用频率、用户行为分析(来源等)等各个方面来增加第三方调用的难度,也可以通过添加一个中间层比如node.js来实现;

非法访问通常使用认证来解决,方法很多session,token,oauth第三方框架等等。
(1)常规的方法:用户登陆后生成token,返回客户端,然后服务器使用AOP拦截controller方法,校验token的有效性,每次token是一样的; (2)用户登陆后生成临时token,存到服务器,并返回客户端,客户端下次请求时把此token传到服务器,验证token是否有效,有效就登陆成功,并生成新的token返回给客户端,让客户端在下一次请求的时候再传回进行判断,如此重复。 这种方法有性能问题,但也有一个漏洞,如果用户在一次请求后,还未进行下一次请求就已被黑客拦截到登录信息并进行假冒登录,他一样可以登录成功并使用户强制下线,但这种方法已大大减少被假冒登录的机会。

(3)两层token:一般第一次用账号密码登录服务器会返回两个token,时效长短不一样,短的时效过了之后,发送时效长的token重新获取一个短时效,如果都过期,那么就需要重新登录了。当然更复杂你还可以做三层token,按照业务分不同token。

对于合法的认证访问,通常需要进行IP访问频率和次数的限制,各种API框架都有支持,比如Django restframework的throttling。
通常我们可以通过使用过滤器和缓存如redis来判断访问次数及频率。在filter层加一个过滤器,拦截所有的请求,解析出请求的用户,然后通过缓存,获取到该用户当前已访问次数。而缓存,要求最好能够自动超时回收,也就是说比如你想设定三分钟内限制访问次数,那么你记录的缓存有效期就三分钟就好了,过了三分钟缓存自动失效,计数器也就重新从0开始了。类似于发短信的接口,每分钟只能发一次;

最外层的限制可能需要在nginx上配置rate limit。