电话一面
-
自我介绍,及为什么读研等等。
-
JVM内存结构,垃圾回收。
-
Java并发
-
- Java的锁有哪些
参考答案:公平锁/非公平锁;是否可重入;独享锁/共享锁,读写锁ReentrantReadWriteLock则可以看成是独享锁和共享锁的组合;悲观锁/乐观锁(CAS)
- Java的锁有哪些
-
- synchronized与lock的区别
-
架构及优化
-
- 总体的思路
-
- 负载均衡的种类:四层,根据ip+port;七层,根据url;DNS(参考linux负载均衡总结性说明(四层负载/七层负载))。负载均衡的算法,一致性哈希
-
- mysql主从和主备的区别。mysql的主要存储引擎及其区别。事务。
-
- 分布式事务:可参考4.4.5 详解分布式一致性协议与第六节 分布式事务回答
-
- 分布式锁
我提到了可以用redis和zookeeper来实现分布式锁,但他还问怎么用数据库实现,可参考基于数据库实现的分布式锁
- 分布式锁
-
- 数据库与缓存的一致性
电话二面
- 自我介绍等。
- 线程池的核心参数
- 锁升级,轻量级锁。CAS怎么解决ABA问题。volatile。
- JVM堆区结构。怎么调优。G1的优点。线上的OOM问题怎么排查。CPU load太高怎么排查,你的第一感觉是什么问题,答:死循环等代码问题。问:GC有没有可能?1
- NIO2, 3,4
一些关键知识点:
BIO的数据读写必须阻塞在一个线程内等待其完成。
IO多路复用:可以用一个线程处理多个网络连接
Selector选择器:不再轮询通道,而是轮询事件。基于事件驱动机制。epoll。
NIO中可以操作直接内存,也是比BIO性能好的一个原因。
5中把一个IO操作分成两个步骤:发起IO请求和实际的IO操作,来区分是否阻塞,和同/异步。我觉得似乎可以帮助理解。 - Netty 6
- 分库分表
- 分布式事务。TCC
- 主键索引
- 大数据产品熟悉吗?比如流计算,像Spark,Flink。
- zookeeper选举过程7。用zk实现分布式锁
- kafka吞吐比较高的原因。消息顺序性。
- 秒杀
视频三面
说我项目简单没什么好问的,就开始出各种系统设计题,节奏还快,我四五秒钟还没答上来还在思考,就“这个问题略过”了。。
-
自我介绍与项目介绍。
-
怎么解决微博/微信的大V发消息时的流量洪峰问题?答:消息队列销峰。问:整个流程呢?发布的流程?订阅的流程?8参考答案的要点:推拉模式即在线推,离线拉,用户关注的feed用redis的zset实现,sort为time。问:怎么解决热点问题?答:用redis。问:怎么解决缓存穿透(我感觉他说的缓存穿透,其实是我理解的缓存击穿)?缓存应该在何时加载,读时还是写时?如何提高缓存的命中率?
-
QPS突然下降,应该从哪几个方面定位问题?我:用top命令查看cpu负载过高,或者占用内存过高的进程,并借助jstack,jmap等命令。也考虑正在GC的情况。问:怎么样CPU负载才算高?才算有问题?我:。。。blala。有可能代码有问题。问:排除代码有问题的情况,还有什么可能?我:网络问题。问:如何排查网络问题?我:用netstat命令。问:用netstat可能看不出来,因为连接都还存在。我:。。。问:就是你平常定位网络问题,除了netstat,还会常用到哪些命令?我:。。。问:除了网络问题,还有哪些可能?我:负载均衡nginx。问:具体怎么排查?我:。。。我觉得容器集群有一两台挂掉导致QPS下降的可能更大。
复盘:ELK日志系统。jstack查看线程状态,看线程是否在sleep,或等待某个资源或者锁,甚至是引发了死锁9,10 。 jmap、jstat看内存和GC情况11。
Arthas工具的trace命令可以跟踪统计方法耗时12:
数据库的原因。 -
订单系统的订单号怎么生成?答:雪花算法。问:还有呢?答:redis自增。问:扣减库存这种写热点问题,怎么解决?我:用lua脚本操作redis可以保证操作的原子性,防止超卖。问:redis保证不了数据强一致,和数据容灾。应该怎么办?或者说,要把扣减库存和支付做成一个事务,怎么做?我:分布式事务,2PC等。问:事务的久悬知道吗?相关知识:蚂蚁集团-----分布式事务 Seata TCC 模式深度解析之 3.3 悬挂 。问:怎么样让分布式事务跨数据源?我心里想:分布式事务不就是跨数据源的?
-
知道哪些负载均衡算法?
-
最近有看哪些书?觉得自己最擅长哪一块?答:数据结构。问:LevelDB的LSM树知道吗13? 怎么实现一个入队出队都不加锁的队列,要尽量高性能?相关知识:ConcurrentLinkedDeque和ConcurrentLinkedQueue的入队出队都采用乐观锁(即volatile+CAS),但是size操作需要O(n)。为什么ConcurrentLinkedQueue内部不维护一个size变量来跟踪队列的长度呢?因为ConcurrentLinkedQueue通过cas操作来保证并发安全。而cas操作只能保证单个变量的并发安全性,无法在出入队列操作的同时,维护size变量。(后面的观点来自14)
-
你觉得自己作为一名老程序员,有哪些优点?
一些相关链接:
蚂蚁金服面试经验分享,阿里的offer真的不难
蚂蚁金服的一次面试经历(一面、二面)
蚂蚁金服社招笔试——根据需求实现一个转账接口
关于JAVA NIO是同步非阻塞I/O的解释:
同步IO和异步IO的区别就在于第二个步骤是否阻塞,如果实际的IO读写阻塞请求进程,那么就是同步IO; 如果不阻塞,而是操作系统帮你做完IO操作再将结果返回给你,那么就是异步IO。
阻塞IO和非阻塞IO的区别在于第一步,发起IO请求是否会被阻塞,如果阻塞直到完成那么就是传统的阻塞IO,如果不阻塞,那么就是非阻塞IO。
《专题二 单节点系统》之《第三章 应用服务器优化》之《第三节 Tomcat容器优化》:
↩︎