腾讯音乐后端开发岗多轮面经
- 轮次
- 多轮
- 时间
- 2026-09
- 来源
- 牛客网
《面试题目》
- C++ 中 const 和 static 的作用分别是什么?
- 协程相比线程的性能优势来自哪里?
- Reactor 是什么?单 Reactor 与多 Reactor 有什么区别?
- select、poll、epoll 的工作方式和适用场景有什么区别?
- 什么是 TCP 粘包与拆包?为什么某些场景不直接使用 HTTP?
- protobuf 解决了哪些问题,如何与其他序列化协议比较?
- MySQL 分库分表时如何选择分片键并处理跨库查询?
- MySQL 主从复制如何工作,如何处理复制延迟?
- Redis 缓存击穿、穿透和雪崩分别如何防范?Redis 持久化和主从同步如何选择?
- 如何设计 10 万 QPS 的用户消息查询服务并决定 Redis 的缓存内容?
- Go 的 goroutine 如何由 GMP 调度?发生网络 IO 时调度器如何处理?
- 线上服务内存占用过高、慢查询或下游变慢时,如何定位和保护系统?
- 如何设计秒杀系统的幂等、库存扣减、限流熔断和故障恢复?
- 优化 RAG 检索时,文档切分大小和 topK 过大或过小分别有什么影响?
《参考解析》
- 协程由用户态运行时调度,切换通常不需要完整切换内核线程;Reactor 以事件循环分发 IO 事件,多 Reactor 可把连接接收和业务处理分摊到不同线程。select/poll 需要遍历描述符,epoll 通过就绪事件回调更适合大量连接。
- 粘包拆包来自字节流没有消息边界,应在协议层增加定长、长度字段或分隔符。protobuf 用 schema 定义紧凑的二进制编码,需结合兼容性、可读性和跨语言支持与 JSON 等方案权衡。
- 分库分表应先按访问模式选择稳定、分布均匀的分片键,跨分片查询通过路由、并行查询和聚合处理;主从复制需监控位点/延迟,读写一致性要求高的请求应读主库或按位点等待。
- 缓存穿透可用布隆过滤器和空值缓存,击穿可用互斥重建或逻辑过期,雪崩可通过随机 TTL、分批预热和限流降级缓解。Redis 持久化按恢复目标选择 RDB/AOF,主从同步与哨兵/集群共同提供故障转移。
- Go 的 goroutine 由 P 持有本地队列并在 M 上运行,阻塞 IO 时运行时会让出执行资源。线上排查应结合指标、火焰图、堆转储、慢查询和链路追踪;下游突发变慢时用超时、舱壁、限流和熔断防止线程、连接池及消息堆积。
- 秒杀扣库存要保证原子性,业务唯一键或幂等记录防止重复下单,令牌桶/漏桶控制入口流量,熔断后需有明确恢复条件。RAG 参数应以评测集权衡召回率、上下文噪声、延迟和成本,不能只凭单个案例调整。