2025.3.19 网易(群面...持续2个小时...)

199 阅读4分钟

一面(两个面试官)

  1. 自我介绍
  2. 挑一个你觉得最难的项目介绍
    • 拨测预警当知道某个下游不可用时,你会有什么预案去处理?
    • 那如果现在是一个对下游非强依赖的系统,你会有什么方案去优化下游的不稳定性
    • 某个外部服务负载很高,接口响应很慢,由于你要查出全部的数据拼接在一起才能返回,导致你的接口也很慢,或者甚至说外部接口失败率达到90%了,该怎么优化你这个接口性能?
    • 假设线上QPS比较高,但可能很多时候查询的是同个实体的属性,你会不会出现重复请求?
    • 缓存是采用Redis,还是进程中的缓存
    • 但是这种缓存时间其实本质还是配死的,除了缓存,你还有什么其它方案吗?
  3. 问一下SaaS化建设相关
    • SaaS化有个比较大的问题就是,很多租户的需求都不一样,而且很难统一,对这种不同租户不同定制化需求你有什么方案吗?
    • 他们是同一份代码吗?
    • 多态对小量的大租户我觉得没有问题,但是如果是大量的小租户就不大可能都去定制化开发,因为根本就不值得,要不就流失它,要不就让它强行按照我们标准模式,这个问题你有什么更好的思路?(配置化)
    • 你们有没有那种偏低代码的设计,让租户自己去写代码实现,或者通过界面拖拉拽的方式去迭代
    • 有没有遇到过租户的量级变更,例如某个租户一开始体量很大,后面变成小租户,只能从大集群迁到小集群,有些小租户又做大了,想从小集群挪到大集群,这个过程他们又不想做停机维护,你会有什么方案吗?
    • 灰度过程写操作会写新集群的DB吗?有没有出现有的请求写了新库,但是有的请求去查的旧库,导致查不到数据
    • 怎么检验新旧库之间有没有同步错误或同步延迟?
    • 但很多时候我们并不知道问题出现在什么地方,查新和查旧我不知道是不是一样,查不到我不知道是不是真的没有数据还是因为没同步成功?
    • 可能某个表字段写错了,导致这个表某个时间点之后的数据没同步过去新库,你又没发现,怎么解决这类问题?
  4. Go语言了解过逃逸分析吗,发生在哪个阶段,是什么作用
  5. 了解过channel的实现原理吗
  6. 可以讲一个场景吗,有一个goroutine去往ch里写,另一个goroutine去读,会怎么样,从底层实现的角度上说
  7. 假设一个channel是没初始化的,往里头写数据,会怎么样
  8. go开发中net/http包,没调用resp.Body.Close()会有什么问题,会影响接收下一个http包吗?
  9. 这段代码会输出什么
func main() {
    l1 := make([]string, 0, 3)
    l1 = append(l1, "a")
    l2 := append(l1, "b")
    l2[0] = "c"
    fmt.Println(l1)
    fmt.Println(l2)
}
  1. 说一下切片的底层实现
  2. := 和 = 的区别
  3. 说一下这段代码会有什么问题
func myFunc() {
    m1 := map[string]string{"a": "a"}
    go func() {
       _ = m1["a"]
    }()
    go func() {
       m2 := map[string]string{"a": "c"}
       m1 = m2
    }()
    time.Sleep(10 * time.Second)
}
  1. 实现下面函数
func consumerChan(ch1, ch2, ch3, ch4 chan int) {
    // 已知,一个已经close的ch,去读时如果缓冲区为空会返回零值
    // 实现从每个ch中正常读取值,某个ch可能会提前释放,他们之间的顺序不确定
    // 4个ch可能是带缓冲的,也可能不带缓冲的
    // 要求:当4个ch都close了,函数才退出
}
  1. 还有没有不用goroutine的写法
  2. 网络相关:工作中有发现一种TIME_WAIT状态吗,是为什么出现,出现比较多时你会怎么处理(用netstat查看是可以看到的)
  3. 假设有一个网络连接,TCP已经建立好了,突然网线断开了,服务端能感知到TCP连接已经断开吗
  4. 后续物理层的网络(网线重新接上)又恢复了,能继续用这个TCP连接收发数据吗
  5. 平时我们的程序是客户端,MySQL是服务端,之间通过TCP连接,现在应用程序开启了一个事务,但是程序发生了panic,MySQL能感知到客户端已经崩溃了吗,是怎么处理这个事务的?
  6. 代码题:实现这个功能
type smap interface {
Set(key string, val any)
Get(key string, timeout time.Duration) any //读取一个key,如果key不存在阻塞,等待key存在或者超时
}
  1. 反问