再战快手--二面
- n!系统设计题。
缓存、线程池等。等间隔分发,例如(1,100),(101,200),保证能命中缓存。当时如果n太大,间隔太小,会计算很久。这里还涉及到大数相乘。
- 供应商自动切换,什么时候自动切换?如何决定切换到哪个供应商引擎?如何做到1s切换。
- 收集产商数据,如果很多客户端反馈出问题的时候,例如调用joinRoom失败,自动切换到另一个产商。
- 另一个产商,需要考虑当前房间的sdk是否支持某个feature,一些定制的东西,某个版本是否有bug。以及该产商的容量支持情况,全部切换过去,是否支持?
- p99 50ms,p9999 500ms,如何优化这个p9999到50ms内。
思路:
- 大于500ms的打印出日志,根据链路排查具体原因。
- 可以利用当时的请求参数,再模拟一遍。定位具体的问题,耗时在哪里?
例如慢查询、重复调用某个服务,串行运行,下游服务耗时长,gc,未加缓存等。
- gc问题如何定位
- 常用命令,例如jmap查看当前占用最多的内存是哪个类,jstack查看线程执行情况,阿里的arthas等。然后定位到占用最多的对象。
- 查看gc日志,重点看哪些东西?当前使用的哪种gc算法,用的是fullgc还是young gc。回收前是多少内存,回收后是多少内存。gc的间隔,有什么规律。
- 利用在线的一些网站,分析规律。
- MAT/visualvm/arthas:watch/trace方法耗时/反编译类/查看类加载器
- 双机房容灾要考虑哪些事情?会出现哪些问题?中间件是有状态的,需要怎么做?
- 容量如何评估。根据当前实际业务情况,以及cpu使用率,内存占用,磁盘占用情况等作出评估。
- 将已有流量切换到另外一个域名,接入层切换流量。域名通过长链下发。域名解析替换也可以,但是有dns本地缓存,不够实时。
- 数据如何做实时同步,出现脑裂问题(孤岛、多个leader)如何解决?zk watcher和轮询并行。有主机房和从机房的概念,出问题时,切换到从机房。
- 机房恢复后,数据如何同步,赶上了才能再次切换。
- 某个机房外口出问题的时候(一般内网机房机器能互通),例如电缆被挖了,如何处理?内部流量转发。
- 我这里主要是考虑了某个机房断电的情况。
- 对我的期望?
- 做某个方向的owner。承担需求评审和技术把关。沉淀一些基础组件。
- 技术驱动产品,收集已有数据推动产品去落地。
- 提高影响力,在一级部门和二级部门有较大影响力。