20240807面经背诵

  1. 聚簇索引与非聚簇索引?

    • 聚簇索引:决定了表中存储顺序的索引,例如主键索引就是聚簇索引,其叶子结点真正存储这个表中的行数据
    • 非聚簇索引:与表中存储顺序无关的索引,而是按照特定索引值来排序的索引,其叶子结点存放的是对应的主键id。
  2. TCP传输的可靠性保证?

    • 按照数据块来传输,每个数据块被称为报文或者段
    • TCP确保每个包的首部和数据的校验和,校验和不通过的包会被丢弃
    • 失序的包重排序和重复的包进行去重
    • 重传机制,TCP在发送一个数据包后,需要在一定的时间内接收到对端的ack才会传送下一个包,如果接收到ack,会重传之前的包
    • 流量控制,通过流量窗口来控制接收数据的速率
    • 拥塞控制,通过拥塞窗口来控制在网络拥塞情况下发送数据的速率,尽量降低丢包率
      • 慢开始
      • 拥塞避免
      • 快重传和快恢复机制
  3. linux怎么查看内存情况?怎么查看进程情况?怎么查看cpu情况?

    • 内存情况:通过free指令来查看
    • 进程情况:ps指令
    • cpu情况:top或者htop指令。
  4. hash的底层数据结构?有什么解决哈希冲突的方法?

    • 底层使用dict和zipList
    • 解决哈希冲突的方法:
      • 拉链法
      • 开放寻址法:继续去寻找下一个可以存放这个值的位置,可分为线性探测,向下遍历有效位置,二次探测,利用二次探测函数来找到下一个位置;双重哈希,再利用一个哈希函数计算查找步长
      • 再哈希法:
        • 当哈希表中的元素大于某个阈值后,扩大哈希表的容量,然后再次哈希
  5. 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包
  6. TCP连接中,假如一方断开,另一方还在listen怎么办?

    • 举个例子就是客户端异常断开,而服务端还在监听
    • 超时机制:在一段时间内没有接收到来自这个客户端的数据,服务端会关闭这个连接
    • 心跳:在一定时间内没有收到来自客户端的心跳的包,会认为客户端已断开,服务端会关闭这个连接
    • TCP keepAlive机制:服务端会定时发送一个探测包到客户端,如果客户端没有响应,则认为客户端断开,关闭连接
  7. 从打开网页到展示网页都发生了什么?

    • 根据网页的URL地址去DNS服务器中寻找对应的ip和端口
    • 根据查找到的ip和端口去建立TCP连接
    • 请求建立后发送http请求报文
    • 服务端接收到http请求报文后进行处理,返回http响应报文给客户端
    • 客户端拿到响应报文后,解析响应体中的html代码,同时渲染网页,同时根据响应体中其他资源的url再去发起对应的请求,直到网页渲染完成
    • 当客户端不需要这段连接,可以主动关闭连接,也可以等待服务端关闭连接
  8. 如果单机扛不住大流量怎么办?怎么把请求打在每一个机器上?

    • 应用层面:限流
      • 最前端Nginx可用漏斗算法限流
      • 在网关可以利用令牌桶算法限流
    • 物理层面:
      • 加机器,做多实例部署
    • 怎么把请求打在每一个机器:
      • 利用负载均衡:
      • 两种负载均衡:
        • 请求从前端过来到网关,网关层的负载均衡
          • 只需要定义好一个路由,包括其id,uri和predicate,filter,并且在uri中的格式为lb://服务名
          • Spring Cloud Gateway是默认开启负载均衡的,默认负载均衡策略为轮询
        • 调用服务时的负载均衡:
          • 如利用openFeign进行远程调用,openFeign本身集成了Spring Cloud LoadBalancer来进行负载均衡
      • 这些负载均衡都依赖注册中心将服务注册上去,例如Nacos
      • Nacos同时还作为配置中心
      • 无论作为配置中心或者注册中心,都采取的观察者模式,用特定的服务来监听Nacos,采取长轮询的方式,无论是拉取配置信息或者拉取服务列表,都是这种方式,长轮询情况下,客户端会轮询Nacos服务器,但是Nacos不会立即返回响应值,而是监听这些配置是否有修改,如果有修改,那么立即返回修改的内容,如果无修改并且到时间,则会一个空响应
  9. 有哪些负载均衡策略?

    • 轮询
    • 加权轮询:权重更大的实例会接收到更多的请求
    • 最少连接:
    • 加权最少连接:
    • 随机
    • 加权随机
    • 哈希:根据请求参数和url来计算哈希值
    • 一致性哈希 :确保同一类请求一定会发送给同一个机器,不会受到集群内增加或减少机器的影响
    • 最少连接:连接最少的优先将请求发送给这个实例
    • 最快响应时间:响应时间最短的优先将请求发送给这个实例
  10. 怎么分析某个进程的资源使用情况?

    • 使用htop或者top可以看到每个进程的cpu使用率
    • ps来看到每个进程的资源使用情况
    • 使用sysstat包中的pidstat -p 进程id 几秒刷新一次来观察每个进程的资源使用情况
  11. Tomcat或者SpringBoot是怎么实现接受请求的 listenAndServe?

    • Tomcat或者SpringBoot在启动时会实例化一个或者多个connector用于监听端口
    • 当客户端发起连接时,connector会处理连接,并创建一个socket连接
    • 当客户端发送数据到服务端时,connector会从socket中取出数据,并封装成HttpServletRequest对象
    • 然后这个对象会被发送到对应的servlet
    • servlet处理完毕后将响应值再封装成HttpServletResponse对象,然后通过connector发送给客户端
    • 请求处理完毕,关闭连接,connector继续监听来自这个客户端或者其他客户端的连接请求
  • 12
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值