快手:一面
自我介绍
2、项目问题:
- netty 内部是如何设计处理事件的
- reactor 模型:单线程单 reactor、单线程多 reactor、多线程多 reactor (netty 采用的第三种)
- netty 心跳检测是如何做的?
- netty 自带的 idlestatehandler
- linux 哪个命令可以查看当前所有的连接?
- netstat 命令 (不记得了)
- socket 在 tcp 连接中有哪些状态?(答得也不怎么样,磕磕绊绊的)
- closed、listen、syn_send、syn_recv、established
- fin_wait_1、fin_wait_2、close_wait、last_ack、time_wait
- linux 你经常使用的命令
- ls、chmod、cd、tail、head、kill (基本命令)
- zookeeper 的结点类型有哪些?
- 持久化、持久化顺序的、临时的、临时顺序的
- 本来想补充下 zookeeper 内部的架构的,结果忘了
- zookeeper 的分布式锁和 redis 分布式锁的区别?(问的其实是 zk 的优点)
- 就回答了 zookeeper 的稳定性更好,但是效率相对较低 (不是特别清楚)
- redis 分布式锁如何解决业务未执行结束就释放,以及提前结束没有释放着两个问题 (就是问锁的时间)
- 回答的是设置逻辑过期时间 (瞎说的,应该是不对的)
- redisson、squirrel 内部自己处理的,手写的分布式锁是做不到的 (面试官说好像是快照什么来着)
- 线程池的线程数量是如何变化的?(就是问线程池怎么处理任务的)
- 线程数量小于核心线程、那么就创建线程去处理
- 线程数量等于核心线程,进入阻塞队列、如果超过阻塞队列就开启非核心线程
- 线程数量等于最大线程,使用拒绝策略
- 线程池场景题 (我是真的不会这种问题)
- 问现在数据库有 100w 量级的数据、每条数据的处理时间是 1s
- 现在想用多线程来并发加速处理 100w 条数据,那么应该如何设计 (面试官给了大致思路)
一个主线程分批读取数据库中的数据 (每批 100 条)、然后交给线程池中的线程异步处理,采用同步手段让主线程等待线程池处理结束然后将结果交还给主线程
- countdownlatch 相关 (没怎么用过不会)
- 基本问的就是 countdownlatch 的使用吧,没有问底层
- 写 SQL
- 班级表中有 class_id 和 student_id 两个字段,然后统计哪些班级的人数超过 20 个并且按照从小到排序
3、实习经历
- 优惠券的底层是怎么存储的?
- 没有被归档处理的优惠券都是采用 rds (mysql + zebra) 存储的,归档后的优惠券都是用 hive 存储的
- 优惠券的模板有采用 redis 存储
- 幂等性控制的时候用了 redis 存储标识符,用于判断优惠券或者说权益是否发放过
- 优惠券的量级是多少?
- 压测时候的数据大概在 180w 左右 (不是特别清楚)
- 压测时候的核心链路 qps 大概在 1200
- 优惠券的并发控制的粒度是怎么样的?
- 天降红包等活动都是在用户的粒度控制的
- 秒杀活动等活动都是交给上游的活动中心负责的,那些应该是优惠券的粒度
- 天降红包、优惠预估、分摊系统...
4、算法题:搜索旋转排序数组 (二分)
5、反问:
- 业务:tob
- 如何处理产品和研发的思考角度不一致的问题?
- 加班情况
- 应届生应该更加注重技术的广度还是深度?