头图

今天还是分享一下组织内部成员最近的面经,是来自迅雷的go后端开发面经

内容涵盖Redis、分布式锁(SETNX/RedLock/可重入锁)、高可用(故障转移、脑裂防护)、数据一致性方案(事务消息、延迟双删、幂等设计)、消息队列可靠性(持久化、副本机制)等等


面经详解

1. 逃逸分析

定义与作用

逃逸分析是Go编译器在编译阶段自动判断变量应分配到栈(函数结束时自动回收)还是堆(需GC回收)的优化技术。其核心目标是减少堆内存分配次数,降低GC压力,提升程序性能。

判定规则

编译器通过以下条件判断变量是否逃逸:

  • 指针逃逸:函数返回局部变量的指针(如return &x)
  • 动态作用域:变量被闭包或外部函数引用
  • 动态大小:变量容量在编译时无法确定(如make([]int, n)中的n是变量)
  • 接口类型转换:变量被赋值给interface{}类型(如fmt.Println(x)中的参数)

2. Channel的底层原理

核心结构

  • hchan:包含缓冲区(环形队列)、发送/接收队列(sudog链表)、互斥锁等
  • 缓冲区:有缓冲Channel存储数据,无缓冲Channel直接阻塞等待配对操作

发送流程

  1. 加锁,若缓冲区未满则写入;否则加入发送队列并挂起当前Goroutine
  2. 接收端唤醒时,从缓冲区或发送队列取出数据

接收流程

  1. 优先从缓冲区读取;若为空,加入接收队列并挂起
  2. 发送端唤醒时,直接传递数据或写入缓冲区

3. 分布式锁与红锁(RedLock)

SetNX不可重入的原因

  • 基于Redis的单命令操作,未记录锁持有者信息,无法识别同一线程多次获取锁

可重入锁实现

  • 在Redis Hash中存储锁标识(如线程ID)和重入次数,每次获取时递增计数器

红锁(RedLock)

  • 原理:向N个独立Redis节点申请锁,半数以上成功则视为获取锁
  • 优势:避免单点故障,提升可用性
  • 问题:时钟同步、网络分区可能导致锁失效,需权衡一致性与性能

4. 高可用的理解

核心指标

  • 可用性公式可用性 = MTBF / (MTBF + MTTR)(MTBF为平均无故障时间,MTTR为平均修复时间)
    实现手段
  • 冗余:主从复制、多副本部署(如Redis Cluster)
  • 故障转移:哨兵机制(Sentinel)、自动切换主节点
  • 负载均衡:通过代理层(如HAProxy)分散请求

5. Redis集群部署模式

  1. 主从复制:一主多从,主节点写,从节点读(数据异步复制)
  2. 哨兵模式:Sentinel监控主节点,自动故障转移(解决高可用问题)
  3. Cluster模式:数据分片(16384哈希槽),多主多从,支持水平扩展

6. 哈希槽缩容

步骤

  1. 迁移目标节点的槽位到其他节点(使用CLUSTER SETSLOT命令)
  2. 数据迁移:逐槽迁移键值,确保迁移过程中服务可用
  3. 更新集群元数据,移除节点
    注意点

    • 迁移期间避免写入热点,需平衡槽分布
    • 缩容后需检查数据倾斜,必要时调整分片策略

7. 事务隔离级别与ReadView

隔离级别

  • RC(读已提交):事务内每次查询生成新ReadView,能看到其他事务已提交的修改
  • RR(可重复读):事务内首次查询生成ReadView,后续复用,保证多次读取一致性
    ReadView差异
  • RC:通过活跃事务ID列表判断数据可见性,每次查询重新生成
  • RR:使用事务开始时生成的ReadView,避免不可重复读

8. Buffer Pool

作用:MySQL的内存缓存池,管理数据页的读写,减少磁盘IO
核心结构

  • Free List:空闲页链表,用于分配新页
  • LRU List:按最近最少使用算法管理热数据页
  • Flush List:记录脏页,等待刷盘

9. Redo Log与Binlog

关系

  • Redo Log:物理日志,记录数据页修改(崩溃恢复)
  • Binlog:逻辑日志,记录SQL操作(主从复制、数据归档)
    提交时机
  • Redo Log:事务提交时刷盘(innodb_flush_log_at_trx_commit=1
  • Binlog:事务提交后刷盘(sync_binlog=1

10. Kafka消息顺序性

保证手段

  • 分区内顺序:单分区内消息按写入顺序存储,单消费者线程处理
  • 生产者配置max.in.flight.requests.per.connection=1 禁止消息重试乱序
    ISR机制
  • In-Sync Replicas:与Leader保持同步的副本集合,用于ACK确认(acks=all
  • Leader选举:仅从ISR中选择新Leader,避免数据丢失
    其他消息队列
  • RabbitMQ:基于队列的严格顺序,但吞吐量较低
  • RocketMQ:支持顺序消息,通过MessageGroup锁定队列

11. HTTPS原理

流程

  1. TCP握手:建立连接(三次握手)
  2. TLS握手

    • 客户端发送支持的加密套件和随机数
    • 服务端返回证书、公钥和随机数
    • 客户端验证证书,生成预主密钥并用公钥加密传输
    • 双方基于随机数和预主密钥生成会话密钥
  3. 加密通信:使用对称加密(如AES)传输数据

12. Etcd

定义:分布式键值存储系统,基于Raft协议保证一致性,用于服务发现、配置管理
核心功能

  • Watch机制:监听键变化,实现实时配置更新
  • Lease机制:租约自动过期,用于分布式锁和节点健康检测
    应用场景:Kubernetes元数据存储、微服务注册中心

13. 分布式数据库

常见方案

  • 分库分表:按业务拆分(如用户库、订单库)
  • NewSQL:TiDB(兼容MySQL协议)、CockroachDB(兼容PostgreSQL)
  • 云原生:AWS Aurora(计算存储分离)、Google Spanner(全球强一致性)
    优化要点
  • 数据分片:避免热点,合理选择分片键(如哈希或范围)
  • 多副本同步:使用Raft/Paxos协议保证一致性

欢迎关注 ❤

我们搞了一个免费的面试真题共享群,互通有无,一起刷题进步。

没准能让你能刷到自己意向公司的最新面试题呢。

感兴趣的朋友们可以加我微信:wangzhongyang1993,备注:sf面试群。


王中阳讲编程
833 声望320 粉丝