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