今天还是分享一下组织内部成员最近的面经,是来自迅雷的go后端开发面经,
内容涵盖Redis、分布式锁(SETNX/RedLock/可重入锁)、高可用(故障转移、脑裂防护)、数据一致性方案(事务消息、延迟双删、幂等设计)、消息队列可靠性(持久化、副本机制)等等
面经详解
1. 逃逸分析
定义与作用
逃逸分析是Go编译器在编译阶段自动判断变量应分配到栈(函数结束时自动回收)还是堆(需GC回收)的优化技术。其核心目标是减少堆内存分配次数,降低GC压力,提升程序性能。
判定规则
编译器通过以下条件判断变量是否逃逸:
- 指针逃逸:函数返回局部变量的指针(如return &x)
- 动态作用域:变量被闭包或外部函数引用
- 动态大小:变量容量在编译时无法确定(如make([]int, n)中的n是变量)
- 接口类型转换:变量被赋值给interface{}类型(如fmt.Println(x)中的参数)
2. Channel的底层原理
核心结构:
- hchan:包含缓冲区(环形队列)、发送/接收队列(sudog链表)、互斥锁等
- 缓冲区:有缓冲Channel存储数据,无缓冲Channel直接阻塞等待配对操作
发送流程:
- 加锁,若缓冲区未满则写入;否则加入发送队列并挂起当前Goroutine
- 接收端唤醒时,从缓冲区或发送队列取出数据
接收流程:
- 优先从缓冲区读取;若为空,加入接收队列并挂起
- 发送端唤醒时,直接传递数据或写入缓冲区
3. 分布式锁与红锁(RedLock)
SetNX不可重入的原因:
- 基于Redis的单命令操作,未记录锁持有者信息,无法识别同一线程多次获取锁
可重入锁实现:
- 在Redis Hash中存储锁标识(如线程ID)和重入次数,每次获取时递增计数器
红锁(RedLock):
- 原理:向N个独立Redis节点申请锁,半数以上成功则视为获取锁
- 优势:避免单点故障,提升可用性
- 问题:时钟同步、网络分区可能导致锁失效,需权衡一致性与性能
4. 高可用的理解
核心指标:
- 可用性公式:
可用性 = MTBF / (MTBF + MTTR)
(MTBF为平均无故障时间,MTTR为平均修复时间)
实现手段: - 冗余:主从复制、多副本部署(如Redis Cluster)
- 故障转移:哨兵机制(Sentinel)、自动切换主节点
- 负载均衡:通过代理层(如HAProxy)分散请求
5. Redis集群部署模式
- 主从复制:一主多从,主节点写,从节点读(数据异步复制)
- 哨兵模式:Sentinel监控主节点,自动故障转移(解决高可用问题)
- Cluster模式:数据分片(16384哈希槽),多主多从,支持水平扩展
6. 哈希槽缩容
步骤:
- 迁移目标节点的槽位到其他节点(使用
CLUSTER SETSLOT
命令) - 数据迁移:逐槽迁移键值,确保迁移过程中服务可用
更新集群元数据,移除节点
注意点:- 迁移期间避免写入热点,需平衡槽分布
- 缩容后需检查数据倾斜,必要时调整分片策略
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原理
流程:
- TCP握手:建立连接(三次握手)
TLS握手:
- 客户端发送支持的加密套件和随机数
- 服务端返回证书、公钥和随机数
- 客户端验证证书,生成预主密钥并用公钥加密传输
- 双方基于随机数和预主密钥生成会话密钥
- 加密通信:使用对称加密(如AES)传输数据
12. Etcd
定义:分布式键值存储系统,基于Raft协议保证一致性,用于服务发现、配置管理
核心功能:
- Watch机制:监听键变化,实现实时配置更新
- Lease机制:租约自动过期,用于分布式锁和节点健康检测
应用场景:Kubernetes元数据存储、微服务注册中心
13. 分布式数据库
常见方案:
- 分库分表:按业务拆分(如用户库、订单库)
- NewSQL:TiDB(兼容MySQL协议)、CockroachDB(兼容PostgreSQL)
- 云原生:AWS Aurora(计算存储分离)、Google Spanner(全球强一致性)
优化要点: - 数据分片:避免热点,合理选择分片键(如哈希或范围)
- 多副本同步:使用Raft/Paxos协议保证一致性
欢迎关注 ❤
我们搞了一个免费的面试真题共享群,互通有无,一起刷题进步。
没准能让你能刷到自己意向公司的最新面试题呢。
感兴趣的朋友们可以加我微信:wangzhongyang1993,备注:sf面试群。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。