前言

比较体现自身能力的一次面试,项目问的比较多,对答如流,但八股问的比较少而且我都不会。

内容

自我介绍

  • 学校背景
  • 有较长时间实习经历
  • 通过读文档、源码很快适应工作
  • 合作完成中期交付并上线
  • 工作之余我还参加了一些比赛,考了一些证件

介绍一下项目主要是做什么的

  • 核心目标
  • 主要功能
  • 使用的技术

看到你们有用到 Redis,是怎么集成进去的,用的什么缓存策略

  • 旁路缓存
  • 主要存了一些,没必要持久化的状态变量
  • 功能背景
  • 使用了 String 存了点赞数、Hash 存了直播间状态变量、ZSet 存了直播消息、弹幕、举手等用 timestamp 作为 score
  • 举例子

我看到你说使用了 Session,主要存放的是什么,知道 JWT 吗

  • 因为 JWT 是携带 token,每次访问 API 都要从数据库中拿用户数据,如果分表了就时间比较长,对用户不友好
  • Session 存放的是用户登录数据,因为我们有个泛在化学习空间
  • 功能背景
  • 需要存放一些要同步的数据

文档光标协同这个是怎么做的

  • 从直播间 Hash 中有一个文档 ID,然后去 Redis 中重新找一下 ZSet

每个用户每输入一次就需要更改吗,还是其他的

  • 20 次左右一提交,因为中间态没必要保存

缓存穿透怎么做的

  • 布隆过滤器 + 逻辑过期 + 逻辑删除 + 缓存空值

你项目中有写布隆过滤器,讲讲

  • 我的理解就是,布隆过滤器是用来缓解缓存穿透问题的。用多个 Hash 函数对 live:room:{roomId} 算 hash 值,然后存到列表或者说二维列表中。01 存,其他的过来,看看是否全 1,不是就不放行。

一次查询的过程中用到了哪些协议

  • 普通查询肯定是用的 https
  • 对于协同交互这块我们用的 WebSocket,因为 ws 中有多个 http 请求,是一个 http 长轮询;我们的项目又是微服务项目,所以没法保证每次 http 请求都能打到同一台服务器,所以我们还开了粘性回话。
  • 总结下来就是协同用 ws,其他调接口用 https

架构演进这块怎么做的

  • 老的使用了 peer.js 这块做的 mesh
  • 新的使用了 sfu
  • 同时水平拓展
  • 解耦信令、媒体流、状态服务,水平拓展

你觉得项目中还有哪些可加强的点

  • WebRTC 不好,应该用 RTSP
  • 说了一下二者优劣

RAG 这块做了什么

  • 起步阶段
  • 用了本地 RAG 发现效果不太理想
  • 用了 Congee 来加持

来点八股

ThreadLocal 原理

  • 只知道怎么用和它的流程
  • 探讨了下进程与线程的关系

垃圾回收机制有了解吗

  • 简单说了下 G1,带了点标记和里面的算法

来点手撕

  • 单例模式加锁 不太会
  • 层次遍历

反问

咱们业务组的 RPC 是怎么弄的,是 DDD 来保障单体,还是直接 MVC 来互相 RPC

  • 说了下 RPC 是微服务组件,其实与 DDD 和 MVC 无关。实际业务中这些都是混杂的。
  • 涉及到人员管理、开发流程方面,实际上就不会太去想 DDD 和 MVC 了。

项目业务还是不太懂,是纯做微服务搭建吗

  • 微服务全链路,中间件、容灾、数据中台、排障
  • 就像从软件工程出发,做业务解耦、加功能

追问

有其他大厂提前批 offer 吗

从今天的面评来看,你项目已经很棒了。但是你要去加强下八股和算法,其他面试官很喜欢卡这两个。

复盘

  • 面试官很和蔼,问的问题都是我比较会的,也归功于之前的模拟题吧
  • 还需要加强下八股