渡边贝塔猫一面
面试问题#
- 请简单自我介绍一下
- 你学的是人工智能专业,为什么会想做后端开发?
- 讲讲你对 Go 语言的了解,它有哪些优点?
- Go 语言有哪些比较特殊的语言特性?
- Channel 三连问:无缓冲发数据 / 有缓冲无接收 / 有缓冲无人发
- 除了 Channel,哪些需要 make?Slice/Map 特点和注意事项
- Panic 三连问:panic 会怎样 / HTTP 服务中 panic 怎么处理 / 什么情况容易 panic
- MySQL vs Redis 数据分类
- 单实例除了 Redis 还有什么缓存方案?
- 缓存重建并发竞争怎么解决?
- Redis 数据结构及应用场景
- MySQL 索引:聚簇/非聚簇、回表、命中判断、覆盖索引
- 介绍一下 Feed 流项目
- 有本地缓存为什么还要 Redis?
- 分布式多实例本地缓存的问题
- RabbitMQ 解决什么问题?
- 用 goroutine / 任务表 / Redis 实现异步
- 消费者失败处理 & 快照机制
- RabbitMQ 消息确认机制
- 反问:对实习生的要求?
- 反问:内部用 AI 提效吗?
- 怎么看加班?
- 长期做后端还是可能会变?
参考答案(AI 生成)#
以下答案由 AI 生成,仅供面试复盘参考。
1. 请简单自我介绍一下#
我是人工智能专业,主要做过 Go 后端、Feed 流、本地缓存、Redis、RabbitMQ 相关项目。我的优势是学习快,能把算法和数据结构思维用到工程里,也愿意追线上问题、性能问题和业务细节。
2. 你学的是人工智能专业,为什么会想做后端开发?#
AI 专业让我接触了数据、模型和工程实现,我发现自己更喜欢把系统真正跑起来。后端开发更接近业务核心,也更锻炼并发、存储、缓存、消息队列这些工程能力。
3. 讲讲你对 Go 语言的了解,它有哪些优点?#
Go 是一门偏工程化的语言,语法简单、编译快、部署方便。它的 goroutine 和 channel 让并发开发成本很低,标准库也很完整,适合写 Web 服务、微服务、中间件和高并发系统。
4. Go 语言有哪些比较特殊的语言特性?#
Go 比较特殊的点有 goroutine、channel、defer、interface、组合式结构体、显式错误返回。它通过 CSP 模型处理并发,也通过垃圾回收降低内存管理成本。
5. Channel 三连问:无缓冲发数据 / 有缓冲无接收 / 有缓冲无人发#
无缓冲 channel 发数据时,发送方会阻塞,直到接收方接收。
有缓冲 channel 发数据且无人接收时,缓冲区未满可以写入,缓冲区满后发送方阻塞。
有缓冲 channel 接收且无人发送时,缓冲区有数据就读,读空后阻塞;channel 关闭后继续读会得到零值和 ok=false。
6. 除了 Channel,哪些需要 make?Slice/Map 特点和注意事项#
make 用于 slice、map、channel。
slice 是动态数组视图,包含指针、长度、容量,append 可能触发扩容并更换底层数组。
map 是哈希表,写入前需要初始化,nil map 写入会 panic,遍历顺序是随机的。
7. Panic 三连问:panic 会怎样 / HTTP 服务中 panic 怎么处理 / 什么情况容易 panic#
panic 会中断当前 goroutine 的正常执行,并依次执行 defer,遇到 recover 可以恢复。
HTTP 服务里通常加 recover 中间件,记录日志、堆栈、请求信息,然后返回 500。
常见 panic 场景有空指针、数组越界、nil map 写入、类型断言失败、关闭已关闭的 channel。
8. MySQL vs Redis 数据分类#
MySQL 适合存核心业务数据,比如用户、帖子、关系、订单、配置等需要事务和持久化的数据。
Redis 适合存热点数据、缓存、计数器、排行榜、分布式锁、会话、Feed 临时数据等高频访问数据。
9. 单实例除了 Redis 还有什么缓存方案?#
单实例缓存还可以用进程内缓存,比如 Go 的 map + mutex、sync.Map、LRU Cache、BigCache、FreeCache。它访问速度快,适合单机热点数据、配置缓存、短生命周期结果缓存。
10. 缓存重建并发竞争怎么解决?#
缓存重建并发竞争可以用互斥锁、singleflight、分布式锁、逻辑过期。常见做法是同一个 key 只有一个请求查库并重建缓存,其他请求等待或返回旧值。
11. Redis 数据结构及应用场景#
String 可做缓存、计数器、分布式锁。
Hash 可存对象字段,比如用户信息。
List 可做简单队列。
Set 可做去重、关注关系、共同好友。
ZSet 可做排行榜、Feed 时间线、延迟队列。
12. MySQL 索引:聚簇/非聚簇、回表、命中判断、覆盖索引#
InnoDB 主键索引是聚簇索引,叶子节点存整行数据。
普通二级索引是非聚簇索引,叶子节点存索引列和主键值,查询其他列时根据主键再查一次,这就是回表。
判断索引命中看查询条件是否符合最左前缀、字段类型是否一致、是否对字段做函数计算。
覆盖索引指查询字段都在索引里,可以直接从索引返回。
13. 介绍一下 Feed 流项目#
Feed 流项目主要实现用户发布内容、关注关系、时间线拉取和缓存优化。核心设计是根据业务选择推模式、拉模式或推拉结合:活跃用户可以推送到收件箱,大 V 可以按需拉取。项目里会用 MySQL 存关系和内容,用 Redis 缓存时间线、计数和热点数据。
14. 有本地缓存为什么还要 Redis?#
本地缓存速度最快,适合减少 Redis 压力;Redis 提供跨实例共享、统一失效、更大容量和丰富数据结构。线上多实例部署时,Redis 能保证各节点看到相对一致的缓存结果。
15. 分布式多实例本地缓存的问题#
多实例本地缓存会带来一致性问题:A 实例更新了缓存,B 实例还保留旧值。常见解决方式是设置较短 TTL、用 Redis 做二级缓存、通过消息广播失效事件,或者把强一致数据集中到 Redis。
16. RabbitMQ 解决什么问题?#
RabbitMQ 主要解决异步解耦、削峰填谷、失败重试和系统间消息传递。比如用户发帖后,写主流程先返回,后续的 Feed 分发、通知、统计通过消息异步处理。
17. 用 goroutine / 任务表 / Redis 实现异步#
异步可以用 goroutine、定时任务、数据库任务表、Redis Stream/List。数据库任务表适合可靠性要求高的场景:写业务数据时顺便写任务记录,再由 worker 扫描执行。
18. 消费者失败处理 & 快照机制#
消费失败可以重试、进入死信队列、记录失败表,再配合告警和人工补偿。
快照机制可以在任务消息里带上当时需要处理的数据版本,消费端按快照执行,减少后续数据变化带来的歧义。
19. RabbitMQ 消息确认机制#
RabbitMQ 的 ack 机制用于确认消息消费成功。手动 ack 模式下,消费者处理成功后 ack;失败时 nack 或 reject,可以选择重新入队或进入死信队列。这样能提升消息处理的可靠性。
20. 反问:对实习生的要求?#
可以问:团队对实习生更看重哪些能力,比如基础、项目经验、学习速度、代码质量还是线上问题处理能力?实习生入职后通常会参与哪些模块?
21. 反问:内部用 AI 提效吗?#
可以问:团队内部会用 AI 做代码生成、单测生成、接口文档、日志分析或研发流程提效吗?我自己平时会用 AI 辅助查资料、生成样例、解释报错和做代码 review。
22. 怎么看加班?#
我接受阶段性加班,比如版本上线、线上问题、关键节点。更看重目标清晰和效率稳定,平时会尽量把任务拆清楚、提前暴露风险,关键时刻能顶上去。
23. 长期做后端还是可能会变?#
我的主线会先放在后端开发上,持续积累服务端、数据库、缓存、消息队列和分布式能力。AI 背景会成为加分项,后续在智能化业务、推荐、数据处理、AI 工程化方向也能结合起来。