Klook后端暑期实习一面面经
《面试题目》
项目/系统设计
- 假设大V有很多粉丝发动态怎么处理?(针对大V的推/拉模型区分)为什么要这么做?
- 如果他的活跃粉丝还是很多呢?(追问大V推模型的瓶颈)
- 构建一个通道,这个通道指的是什么?具体用什么技术组件来表达通道?
- 用户关注的人也很多,比如一个用户关注了10万人,他每次打开关注页该怎么处理?复杂度在哪里?
- 如果只保留一段时间(如10天)的记录,用户60天后查10天以前的历史动态怎么办?
Java 基础
- Java 线程有几种状态?
- 执行了 wait 方法,线程处于什么状态?
- 执行了 sleep 方法呢?
《参考解析》
- 推模型 vs 拉模型的选择依据:推模型(Feed 生成时主动写入每个粉丝的收件箱)适合普通用户(粉丝量少,写扩散成本低,读取速度快);拉模型(粉丝读取时临时聚合关注列表的动态)适合大V(粉丝量巨大,若用推模型会导致一次发布触发海量写操作,即”写扩散风暴”),因此业界通常采用推拉结合的混合模型——普通用户用推模型、大V用拉模型,读取时再把两部分结果合并。
- 10万关注列表的读取复杂度:如果每次打开关注页都要实时聚合10万个人的最新动态再排序,聚合和排序的计算成本会随关注数线性增长,可以通过预先维护一个按时间排序的”关注动态时间线”缓存(定期或增量更新),或限制只聚合活跃度较高的一部分关注对象,来降低单次请求的计算复杂度。
- Java 线程状态:NEW(新建未启动)、RUNNABLE(可运行,包含运行中和就绪)、BLOCKED(阻塞,等待获取监视器锁)、WAITING(无限期等待,如调用了不带超时参数的
wait()/join())、TIMED_WAITING(限时等待,如sleep(time)、带超时参数的wait(time))、TERMINATED(终止)。调用wait()进入 WAITING 状态(需被notify()/notifyAll()唤醒),调用sleep()进入 TIMED_WAITING 状态(时间到自动恢复,且不释放持有的锁)。