网易后端面经
时间点如下:7.3投递 -> 7.12一面 -> 7.19二面
一点思考
网易问的偏中间件技术原理,语言层面基本没问。一面面试官比较年轻,不断追细节,感觉还是比较青涩。二面面试官估计是leader,有的问题问的很离谱,最后把我给激怒了。整体下来体验不是很友好,就没有后续了。
今年找工作十分不易,市场候选人很多,能过就是钱给不到位!希望这篇面经能帮到大家~
网易云信一面(7.12 19:00)
说一个源码改进业务的例子。
websocket心跳如何实现?
zk/db/redis锁怎么选型。
8台物理机能撑住百万的长连接,一台能撑住13w???数据感觉有问题,至少有20台吧(lf+hl)
- 多租户隔离,为什么不用两个进程?
- 需要下沉容器层,有插件层消除重复。
- 表现为同一个应用,然后只注册到注册中心一次。两个应用可以使用相同端口号。
- 另外进程就更重了,要消耗更多的资源,而且不好管控。
- 流程编排分支条件如何实现?
- 业务身份,这个有问题,如果大量增加分支,会拷贝多份,会有很多重复的规则文件,但是只有一两个组件不一样。
- 目前做法时在组件中可能有业务条件判断。后续会使用表达式语言增加分支条件支持,业务身份只支持大粒度的区分。
流程编排如何避免大量调用下游服务,是否做了隔离?
感觉调用下游要做熔断,例如hystrix。但是这个有点重了。sdk要做薄。
客服IM也区分在线消息和离线消息,都会存起来,如果掉线了,下次登录成功了主动拉取就行。
网易云信二面(7.17 19:00)
- 多租户隔离怎么做的,应该是db/kafka等中间件(存储)上的隔离,以及流量(计算资源)上的单独部署。
最理想的方案是全部单独部署,隔离性最好,但是成本最高
我主要是代码上隔离开来,然后混合部署。
计算资源(cpu/memory) | 共享一个pod | namespace | 私有化集群 |
---|---|---|---|
线程池/连接池 | 按租户配额 | 流量标的方式,不同标,不同服务实例,类似泳道 | 计算资源和物理资源完全隔离了 |
限流 | |||
定时任务elastic job |
存储资源 | 共用实例 | 不同实例 | x |
---|---|---|---|
mysql | 分库,库名不同,但是连接池可以复用 | 物理层面的隔离 | |
kafka | 不同租户不同topic,或者添加tag | 物理层面的隔离 | |
es | 不同index name | 物理层面的隔离 | |
cos | 前缀不一样? | 物理层面的隔离 | |
redis | key前缀不同 | 物理层面的隔离 | |
zk |
代码资源 | 耦合度 | x | x |
---|---|---|---|
仓库隔离 | KA和业务中台的,有不同的代码仓库 | ||
混合部署 | 依赖无冲突,能实现通信 | ||
开发模式 | 按照各自的开发计划开发 | ||
流量隔离 | 动态调度:动态加载和卸载 | ||
扩展点 | 组件化编程 | ||
编排 | 需要支持不同的分支条件,不能只靠增加业务身份,解决分支问题,不然规则文件会爆炸 |
后续多个聚合业务共用同一个业务中台应用,一个聚合应用发布,另一个聚合应用也得跟着发布,如何解决这个问题?
动态部署
动态部署为什么会卸载不干净?
假设redis能承受主5w qps,db能撑住500qps,db可能随机更新,如何把qps提升到20w,且保证一致性
redis分片,不分片怎么做呢?本地缓存?可能会不一致。
- 双机房容灾,中间件如何做双机房容灾?例如mysql机房数据丢失是怎么解决的?
- 中间件均需要做同步,所有的写操作被定向到一个 Master机房进行,存在跨机房调用。以保证写强一致性,读可以读取主机房,也可以读取从机房。每个机房均包含全量的数据。
- 双向复制,均能写入,需要避免冲突,例如数据库自增id,冲突时提供了基于时间的冲突解决方案,以最后时间戳为准,确保各个机房的数据一致。
- mysql怎么做高可用,canal怎么做高可用,怎么避免重复?
- kafka积压优化,感觉就是削峰填谷,怎么保证数据库不会过载?
当时其实数据库层面也是可以限流的。看下是不是可以扩容db,分库分表。以及增加多个topic。当然前提是处理逻辑没有问题,堆机器是最简单的事情。