好未来面经复盘

谈谈我的一些学习方法:

刚刚开始接触一个概念时,总是会有些难以理解或难以接受:

这时候你可以不停的google,不理解的那一个点去翻阅多篇文章,可能这一篇你没有看懂,但另一篇的讲解角度会使你豁然开朗,同时也明白了上一篇想要表达的概念,多个角度多个方面去学习,你会理解的更快更全面

另外学习时,自己会有一个沉淀的过程。一篇文章你今天看和明天看,会有不同的理解,可能是你理解到了更深的层次,也可能会学习到以前不曾注意的某一个点,还没彻底精通它之前,不定时的多次去学习,效果更好。

学习一个东西,背景概念整体流程(即why、what、how)一定要清楚。你不需要挖的特别细,当你真正在遇到相关的问题时,能想到它可以解决这个问题就算成功了。真正需要它解决问题时,你就可以仔细研究它的具体应用过程和原理了:

首先一个二次学习的过程,它的背景、它能解决什么问题,这些理解性的重要概念将会在你脑中记忆的更加牢固。

其次在业务和问题的驱动下,你的目的性使你学习的效率大大提升,学东西会非常快。


 

 

1.三次握手和四次挥手的状态

好未来面经复盘

好未来面经复盘

2.多线程和多进程的区别

区别:

对比维度

多进程

多线程

总结

数据共享、同步

数据共享复杂,需要用IPC;数据是分开的,同步简单

因为共享进程数据,数据共享简单,但也是因为这个原因导致同步复杂

各有优势

内存、CPU

占用内存多,切换复杂,CPU利用率低

占用内存少,切换简单,CPU利用率高

线程占优

创建销毁、切换

创建销毁、切换复杂,速度慢

创建销毁、切换简单,速度很快

线程占优

编程、调试

编程简单,调试简单

编程复杂,调试复杂

进程占优

可靠性

进程间不会互相影响

一个线程挂掉将导致整个进程挂掉

进程占优

分布式

适应于多核、多机分布式;如果一台机器不够,扩展到多台机器比较简单

适应于多核分布式

进程占优

 

3.多线程和多进程的使用环境

(1)需要频繁的创建和销毁优先用线程

最常见的就是web服务器,来一个链接建立一个线程,断了就销毁线程,要是用进程,创建和销毁的代价都是难以承受的

(2)需要进行大量的计算

大量的计算,耗费很多CPU,切换频繁,线程最合适

最常见的就是 图像处理、算法处理

(3)强相关的用线程,弱相关的用进程

强相关的使用多进程,弱相关的使用多线程

一般的server需要完成以下任务:消息收发,消息处理,“消息收发”和消息处理就是弱相关的任务,而“消息处理”里边可能分为“消息解码”、“业务处理”,这两个相对相关性强;

“消息收发”和“消息处理”可以分进程设计,“消息解码”、“业务处理”可以分线程设计

(4)扩展到多机分布的使用多进程、多核分布的用线程

 

虽然我给了这么多的选择原则,但实际应用中基本上都是“进程+线程”的结合方式,千万不要真的陷入一种非此即彼的误区。

4.CNAME

A记录就是把一个域名解析到一个IP地址(Address,特制数字IP地址),而CNAME记录就是把域名解析到另外一个域名。其功能是差不多,CNAME将几个主机名指向一个别名,其实跟指向IP地址是一样的,因为这个别名也要做一个A记录的。但是使用CNAME记录可以很方便地变更IP地址。如果一台服务器有100个网站,他们都做了别名,该台服务器变更IP时,只需要变更别名的A记录就可以了

5.CDN技术

CDN与直播技术

在地址栏输入一个网址,浏览器本地没有这个网址的DNS缓存,所以向网站的DNS服务器发出请求,网站的DNS服务器设置了CNAME,指向了某个CDN服务器,也就是常见的阿里云、腾讯云、Cloudflare之类的,去请求CDN技术中的智能DNS均衡负载系统;

均衡负载系统解析域名,把对用户响应最快的节点返回给用户,然后用户向该节点发出请求

对于最简单的 CDN 系统而言,只要一台 DNS 调度服务器和一个节点服务器即可,但在复杂的应用中,会存在多级缓存,多台 Cache 来协同工作。

 

架构原理:

1. 访问域名如何映射到CDN地址

当你通过浏览器访问 static.example.com 域名时,假设这就是个静态域名,并且做了 CDN 静态资源加速。

1)首先会经过本地 DNS 解析器,查看下本机 /etc/hosts 文件是否存在域名对应的IP,如果找到,直接使用该 IP 发起请求。否则,执行步骤2)。

2)由于本地 DNS 服务器解析,如果在本地 DNS 缓存中找到域名对一个IP,则直接用该 IP 访问。否则,继续步骤3)。

3)本地 DNS 服务器会向根域名服务器发起请求,根域名服务器返回顶级 DNS 域名服务器地址,让你去它那里查找。

4)本地 DNS 服务器会向顶级 DNS 域名服务器发起请求,.com 顶级域名服务器返回权威 DNS 域名服务器地址,让你去它那里查找。

5)本地 DNS 服务器继续向 example.com 权威 DNS 域名服务器发起请求,权威 DNS 域名服务器一看这个域名我能解析,发现是有做过CDN加速域名配置,它会 CNAME 到 static.xxx.example.cdn.com 域名。

到此,其实我们通过访问静态域名 static.example.com 经过一番波折,终于找到了 CDN 域名地址

如果你不需要找离用户最近的节点,通过 static.xxx.example.cdn.com 域名就可以找到正确的 IP 地址了。

. 如何找到离用户最近的 CDN 节点

结合上图,继续解析如果找到距离用户最近的 CDN 节点。

1)本地 DNS 服务器会将 static.xxx.example.cdn.com 会向第一层 GSLB 全局负载均衡发起请求,第一层全局负载均衡会根据用户所在运营商网络分析,比如移动运营商,返回 CNAME 到如 static.yd.example.cdn.com 域名地址。

2)本地 DNS 服务器会继续向第二层 GSLB 全局负载均衡发起请求,第二层全局负载均衡依据 DNS 地理位置判断,返回 SLB CDN 负载均衡地址。

3)本地 DNS 服务器从返回的多个 CDN 节点 IP 中,可以通过本地简单轮询的方式去选择一个 CDN IP 访问。

此时,最终通过 GSLB 全局负载均衡找到的这些 CDN 节点,就是离用户最近的 CDN 节点了。

好未来面经复盘

GSLB(Global Server Load Balance):全局负载均衡,含义是对部署在不同地域的服务器之间做负载均衡,一方面可以让流量均衡负载到他下面的服务器上,一方面能根据地理位置判断,找到距离用户最近的服务器;

 

6.SYN洪泛攻击

syn洪范攻击的基础是依靠TCP建立连接时三次握手的设计,攻击者发送许多数据包,但不向服务器发送“ACK”。因此,连接半开,吞下服务器资源。由于阻止服务攻击,合法用户尝试连接到服务器但被拒绝。

 

 

7.负载均衡原理

面对大量用户访问、高并发请求、海量数据,当单机容量达到极限的时候,需要考虑业务拆分和分布式部署;

单机网站到分布式存储重要的区别就是需要考虑的是业务拆分和分布式存储;

业务拆分:将应用拆分后,部署到不同的机器上,实现大规模分布式系统

分布式存储

将相同的应用分布到不同的机器上,在集群前边加一个负载均衡设备,实现流量分发;

复杂均衡是将工作任务、工作请求分摊到多个操作单元(服务器)进行执行,是解决高性能,单点故障(高可用),扩展性(水平伸缩)的终极解决方案;

 

  • 1.负载均衡

划分为纵向扩展和横向扩展

纵向扩展:单机的角度通过增加硬件处理能力,比如CPU处理能力,内存容量,磁盘等方面,实现服务器处理能力的提升,不能满足大型分布式系统(网站),大流量,高并发,海量数据的问题

横向扩展:通过添加机器来满足大型网站服务的处理能力。比如:一台机器不能满足,则增加两台或者多台机器,共同承担访问压力。这就是典型的集群和负载均衡架构

好未来面经复盘

应用集群:将同一应用部署到多台机器上,组成处理集群,接收负载均衡设备分发的请求,进行处理,并返回相应数据。
负载均衡设备:将用户访问的请求,根据负载均衡算法,分发到集群中的一台处理服务器。

  • 2.负载均衡分类

DNS负载均衡,HTTP负载均衡,IP负载均衡,链路层负载均衡

2.1 DNS负载均衡

2.2 IP负载均衡

2.3 链路层负载均衡

2.4 混合型负载均衡