-
聚簇索引与非聚簇索引?
- 聚簇索引:决定了表中存储顺序的索引,例如主键索引就是聚簇索引,其叶子结点真正存储这个表中的行数据
- 非聚簇索引:与表中存储顺序无关的索引,而是按照特定索引值来排序的索引,其叶子结点存放的是对应的主键id。
-
TCP传输的可靠性保证?
- 按照数据块来传输,每个数据块被称为报文或者段
- TCP确保每个包的首部和数据的校验和,校验和不通过的包会被丢弃
- 失序的包重排序和重复的包进行去重
- 重传机制,TCP在发送一个数据包后,需要在一定的时间内接收到对端的ack才会传送下一个包,如果接收到ack,会重传之前的包
- 流量控制,通过流量窗口来控制接收数据的速率
- 拥塞控制,通过拥塞窗口来控制在网络拥塞情况下发送数据的速率,尽量降低丢包率
- 慢开始
- 拥塞避免
- 快重传和快恢复机制
-
linux怎么查看内存情况?怎么查看进程情况?怎么查看cpu情况?
- 内存情况:通过free指令来查看
- 进程情况:ps指令
- cpu情况:top或者htop指令。
-
hash的底层数据结构?有什么解决哈希冲突的方法?
- 底层使用dict和zipList
- 解决哈希冲突的方法:
- 拉链法
- 开放寻址法:继续去寻找下一个可以存放这个值的位置,可分为线性探测,向下遍历有效位置,二次探测,利用二次探测函数来找到下一个位置;双重哈希,再利用一个哈希函数计算查找步长
- 再哈希法:
- 当哈希表中的元素大于某个阈值后,扩大哈希表的容量,然后再次哈希
-
3次握手和4次挥手的具体状态?为什么等待2MSL
- 3次握手:
- 客户端向服务端发送SYN包,随后进入SYN_SEND状态
- 服务端接收到SYN包,向客户端发送ACK包和SYN包,服务端进入SYN_RECV状态
- 客户端收到ACK包和SYN包,向服务端发送一个ACK包,客户端和服务端都进入ESTABLISHED状态
- 4次挥手:
- 客户端向服务端发送FIN包,随后进入FIN_WAIT1状态
- 服务端接收到FIN包向客户端发送ACK包,服务端进入CLOSE_WAIT状态,客户端进入FIN_WAIT2状态
- 服务端向客户端发送FIN包,服务端进入LAST_ACK状态
- 客户端接收到FIN包,向服务端发送一个ACK包,进入TIME_WAIT状态,在2MSL后未收到服务端重传的FIN包则双端进入CLOSED状态
- 等待2MSL是为了防止因为网络波动而导致ACK包丢失而触发服务端的重传,确保对端关闭后本端再关闭,2MSL刚好是数据包一个发送加一个接收的时间,如果丢包,2MSL刚好够对端重传一个FIN包
- 3次握手:
-
TCP连接中,假如一方断开,另一方还在listen怎么办?
- 举个例子就是客户端异常断开,而服务端还在监听
- 超时机制:在一段时间内没有接收到来自这个客户端的数据,服务端会关闭这个连接
- 心跳:在一定时间内没有收到来自客户端的心跳的包,会认为客户端已断开,服务端会关闭这个连接
- TCP keepAlive机制:服务端会定时发送一个探测包到客户端,如果客户端没有响应,则认为客户端断开,关闭连接
-
从打开网页到展示网页都发生了什么?
- 根据网页的URL地址去DNS服务器中寻找对应的ip和端口
- 根据查找到的ip和端口去建立TCP连接
- 请求建立后发送http请求报文
- 服务端接收到http请求报文后进行处理,返回http响应报文给客户端
- 客户端拿到响应报文后,解析响应体中的html代码,同时渲染网页,同时根据响应体中其他资源的url再去发起对应的请求,直到网页渲染完成
- 当客户端不需要这段连接,可以主动关闭连接,也可以等待服务端关闭连接
-
如果单机扛不住大流量怎么办?怎么把请求打在每一个机器上?
- 应用层面:限流
- 最前端Nginx可用漏斗算法限流
- 在网关可以利用令牌桶算法限流
- 物理层面:
- 加机器,做多实例部署
- 怎么把请求打在每一个机器:
- 利用负载均衡:
- 两种负载均衡:
- 请求从前端过来到网关,网关层的负载均衡
- 只需要定义好一个路由,包括其id,uri和predicate,filter,并且在uri中的格式为lb://服务名
- Spring Cloud Gateway是默认开启负载均衡的,默认负载均衡策略为轮询
- 调用服务时的负载均衡:
- 如利用openFeign进行远程调用,openFeign本身集成了Spring Cloud LoadBalancer来进行负载均衡
- 请求从前端过来到网关,网关层的负载均衡
- 这些负载均衡都依赖注册中心将服务注册上去,例如Nacos
- Nacos同时还作为配置中心
- 无论作为配置中心或者注册中心,都采取的观察者模式,用特定的服务来监听Nacos,采取长轮询的方式,无论是拉取配置信息或者拉取服务列表,都是这种方式,长轮询情况下,客户端会轮询Nacos服务器,但是Nacos不会立即返回响应值,而是监听这些配置是否有修改,如果有修改,那么立即返回修改的内容,如果无修改并且到时间,则会一个空响应
- 应用层面:限流
-
有哪些负载均衡策略?
- 轮询
- 加权轮询:权重更大的实例会接收到更多的请求
- 最少连接:
- 加权最少连接:
- 随机
- 加权随机
- 哈希:根据请求参数和url来计算哈希值
- 一致性哈希 :确保同一类请求一定会发送给同一个机器,不会受到集群内增加或减少机器的影响
- 最少连接:连接最少的优先将请求发送给这个实例
- 最快响应时间:响应时间最短的优先将请求发送给这个实例
-
怎么分析某个进程的资源使用情况?
- 使用htop或者top可以看到每个进程的cpu使用率
- ps来看到每个进程的资源使用情况
- 使用sysstat包中的pidstat -p 进程id 几秒刷新一次来观察每个进程的资源使用情况
-
Tomcat或者SpringBoot是怎么实现接受请求的 listenAndServe?
- Tomcat或者SpringBoot在启动时会实例化一个或者多个connector用于监听端口
- 当客户端发起连接时,connector会处理连接,并创建一个socket连接
- 当客户端发送数据到服务端时,connector会从socket中取出数据,并封装成HttpServletRequest对象
- 然后这个对象会被发送到对应的servlet
- servlet处理完毕后将响应值再封装成HttpServletResponse对象,然后通过connector发送给客户端
- 请求处理完毕,关闭连接,connector继续监听来自这个客户端或者其他客户端的连接请求
20240807面经背诵
最新推荐文章于 2024-08-14 23:12:09 发布