老酸奶网易雷火web后端开发二面

二面,30min,无手撕。
  1. 讲一下 Go 的协程
  2. 了不了解 TCP 的头部报文
  3. 你的 Feed 流项目是推拉结合还是只是拉的
  4. 现在让你设计一个游戏内对话功能,你把技术选型和设计思路讲讲
  5. 你平时玩网易雷火的什么游戏?段位打到哪了?
  6. 你有没有参加过抽奖活动,让你设计的话你把技术选型和设计思路讲讲
  7. 别的项目和实习相关的

反问#

  1. 业务技术栈匹配度
  2. 多长时间出结果?回答:需要等待横向的意思

结果#

横向一周挂。

参考答案(AI 生成)#

以下答案由 AI 生成,仅供面试复盘参考。

1. 讲一下 Go 的协程#

答:Go 的协程即 goroutine,是 Go 运行时管理的用户态轻量线程。核心特点:启动成本极低(初始栈仅 2KB,按需增长),通过 GMP 调度模型实现高效并发,阻塞时自动切换不浪费线程。与操作系统线程相比,goroutine 的创建、销毁和上下文切换都在用户态完成,可以轻松创建数十万个。goroutine 之间通过 channel 进行通信,遵循"CSP 并发模型"和"不要通过共享内存来通信,而要通过通信来共享内存"的设计哲学。实际使用中配合 sync.WaitGroup、context 等控制生命周期和超时取消。

2. 了不了解 TCP 的头部报文#

答:TCP 头部固定 20 字节,可选部分最长 40 字节。主要字段:源端口和目标端口(各 2 字节)、序列号 seq(4 字节,标识数据流中的字节位置)、确认号 ack(4 字节,期望收到的下一个字节序号)、数据偏移(4 位,头部长度)、标志位(URG/ACK/PSH/RST/SYN/FIN,各 1 位)、窗口大小(2 字节,用于流量控制)、校验和(2 字节)、紧急指针(2 字节)。可选字段包括 MSS、时间戳、窗口缩放等。三次握手时 SYN 标志位置 1,四次挥手时 FIN 标志位置 1,数据传输时 ACK 始终置 1。

3. 你的 Feed 流项目是推拉结合还是只是拉的#

答:常见设计是推拉结合。对活跃用户(粉丝少、内容少)采用推模式:发布内容时直接写入粉丝的收件箱(Redis List/ZSet),粉丝拉取时直接读自己的收件箱,延迟低。对明星/大 V 用户采用拉模式:不推送到粉丝收件箱,粉丝拉取时主动去关注列表各用户的发件箱聚合拉取,避免写扩散。实际工程中会加阈值判断:粉丝数超过 N(如 1000)时自动切换为拉模式。拉取时还会做分页、去重、热点缓存等优化。

4. 现在让你设计一个游戏内对话功能,你把技术选型和设计思路讲讲#

答:

  • 技术选型:WebSocket 做长连接通信,服务端用 Go 的 gorilla/websocket 或 nhooyr.io/websocket,配合 Redis Pub/Sub 做跨服消息广播,Kafka 做消息持久化和异步分发,MySQL 存储历史消息。
  • 设计思路:
    • 连接管理:每个在线玩家建立一条 WebSocket 连接,服务端维护 userID -> conn 映射。
    • 私聊:发送方 -> 服务端 -> 查询接收方连接 -> 直接推送;若接收方不在线则落库,上线后拉取离线消息。
    • 频道/世界聊天:消息发到 Redis Pub/Sub 的对应频道,所有订阅该频道的连接收到推送。
    • 消息可靠性:客户端发消息后服务端落库 + ACK 确认,超时重传。消息 ID 递增保证有序。
    • 敏感词过滤:接入 DFA 算法或调用第三方审核 API,命中则拦截或替换。
    • 限流与防刷:基于令牌桶对单用户做发送频率限制(如 1 秒 3 条)。

5. 你平时玩网易雷火的什么游戏?段位打到哪了?#

答:这道题考察对公司和产品的了解程度以及游戏理解。建议如实回答自己的游戏经历,如果没有玩过雷火的产品,也可以讲自己玩过的其他游戏,并延伸到对游戏系统的理解,例如"我没有深度玩过雷火的游戏,但我是《XXX》的多年玩家,对其中的社交系统/经济系统/战斗机制有一定理解……“重点展示你能从技术角度分析游戏设计。

6. 你有没有参加过抽奖活动,让你设计的话你把技术选型和设计思路讲讲#

答:

  • 技术选型:抽奖逻辑作为独立微服务,Redis 存储奖品库存和用户抽奖记录,MySQL 存储奖品配置和中奖记录,消息队列异步发放奖品。
  • 设计思路:
    • 奖品配置:维护奖品表(ID、名称、类型、总量、日限、权重/概率)。
    • 抽奖算法:按权重分配概率区间,生成随机数落在对应区间即中奖。例如奖品 A 权重 10、B 权重 30、C 权重 60,则在 [0,100) 中随机,[0,10) 中 A,[10,40) 中 B,[40,100) 中 C。
    • 库存扣减:用 Redis DECR 原子扣减库存,扣减前检查是否 >0。抽奖和库存扣减放一个 Lua 脚本保证原子性。
    • 防刷:限制单用户每日抽奖次数(Redis 计数器),加验证码/风控。
    • 发奖:中奖后写 MySQL 中奖记录,发 MQ 消息异步通知下游发奖服务(发道具、发优惠券等),提供对账和补发机制。

7. 别的项目和实习相关的#

答:这题主要是面试官结合简历进行自由追问,重点准备:每个项目的背景、技术选型理由、核心难点、个人贡献、可量化的成果。回答时按 STAR 原则组织(Situation、Task、Action、Result),每个亮点都要能落到具体的技术细节。实习经历要突出业务理解、团队协作和工程落地能力。